android - 无法在 Android 上的另一个线程中访问资源(崩溃)

标签 android multithreading resources

这几天一直让我发疯,我是 android 的新手,我似乎无法弄清楚如何从其他线程访问资源。我正在尝试安排一个任务在一段时间后执行,这是相关代码:

public class TikTakBoom extends Activity {

private SensorManager mSensorManager;

public ToggleButton startButton;

private Bitmap mBombOn;
private Bitmap mBombOff;

/** Tik tak boom **/
protected MediaPlayer mediaPlayer;      // play tik tak or boom
protected Timer boomTimer;              // timer for explosion

// bomb button backgrounds
protected android.graphics.drawable.BitmapDrawable buttonBombOn;
protected android.graphics.drawable.BitmapDrawable buttonBombOff;

// random boom delay in ms
protected long boomDelay = 1500;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // tell system to use the layout defined in our XML file
    setContentView(R.layout.main);

    Log.w(this.getClass().getName(), "SIS is null");

    // configure toggle button (bomb on/off)
    startButton = (ToggleButton)findViewById(R.id.toggleButton1);
    startButton.setText("");
    startButton.setTextOn("");
    startButton.setTextOff("");

    // scale bomb images to button size
    mBombOff = BitmapFactory.decodeResource(this.getResources(), R.drawable.bomb_off);
    mBombOff = Bitmap.createScaledBitmap(mBombOff, 120, 120, true);

    mBombOn = BitmapFactory.decodeResource(this.getResources(), R.drawable.bomb_on);
    mBombOn = Bitmap.createScaledBitmap(mBombOn, 120, 120, true);

    buttonBombOn = new android.graphics.drawable.BitmapDrawable(mBombOn);
    buttonBombOff = new android.graphics.drawable.BitmapDrawable(mBombOff);

    startButton.setChecked(false);

    boomTimer = new Timer();

    // onclick listener for toggle bomb on/off
    startButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // Perform action on clicks
            if (startButton.isChecked()) {
                mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.tik_tak);

                mediaPlayer.setLooping(true);
                mediaPlayer.start();

                // align boom delay with tik tak duration
                boomDelay -= boomDelay%mediaPlayer.getDuration();

                boomTimer.schedule(new BoomTimeTask(getApplicationContext()), boomDelay);

                startButton.setBackgroundDrawable(buttonBombOn);
            } else {
                if (mediaPlayer != null) {
                    mediaPlayer.release();
                    mediaPlayer = null;
                }

                startButton.setBackgroundDrawable(buttonBombOff);
            }
        }

    });
} 

class BoomTimeTask extends TimerTask {
    Context context;

    public BoomTimeTask(Context context) {
        super();

        this.context = context;
    }

    public void run() {
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }

        mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.sheldon);

        mediaPlayer.setLooping(false);
        mediaPlayer.start();

        startButton = (ToggleButton)((Activity)context).findViewById(R.id.toggleButton1);

        startButton.setChecked(false);
        //startButton.setBackgroundDrawable(buttonBombOff);
    }
}

应用程序在 BoomTimeTask.run() 中的 startButton.setChecked(false) 上崩溃,我猜是 NullPointerException。

请帮忙,我要疯了,我已经尝试了一切!什么都没用.. 在没有上下文作为参数传递的情况下尝试了它,因为引用也应该对 BoomTimeTask 线程可见,尝试了很多其他的东西,只是无法让它工作。

我错过了什么?提前致谢,非常感谢任何帮助。干杯,瓦尔。

已解决:how to change button text dynamically for every 3 sec in android?

最佳答案

你应该使用

runOnUiThread(new Runnable() { 
    public void run() { 
    // YOUR ACTIONS ON Graphic interface
    } 
}); 

这是因为在 android 中,如果不在处理 GUI 的线程中,则无法修改 GUI 元素。

http://developer.android.com/reference/android/app/Activity.html

关于android - 无法在 Android 上的另一个线程中访问资源(崩溃),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7113504/

相关文章:

android - 如何在 Android 的编辑文本中将文本限制在 0-59 之间?

java - layout_weight 在表格行中带有按钮和 TextView

java - 如何在不扩展 Activity 的情况下使用编辑文本

c++ - 继承std::thread时如何安全调用成员函数

c - 通过递归函数泄漏线程

java - 使用同步块(synchronized block)预订座位

c++ - 如何从 C++ 中的资源文件加载游标组?

android - 在android中有res/drawable-ldpi吗?

android - 如何转换HH :mm:ss to hh:mm AM/PM in android

c# - Unity从文件夹加载媒体并显示在RawImage上