这几天一直让我发疯,我是 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/