我想在游戏中插入一个计时器。如果时间为0,则会有一个AlertDialog告诉用户时间已到,并返回到前一个活动。下面是这个方法(它在一个扩展SurfaceView的类中):
public void showTime(){
time--;
Log.i("GameView time", "" + time);
if (time <= 0){
Log.i("gameview time","time out");
gameTimer.setRunning(false);
AlertDialog.Builder alt_bld = new AlertDialog.Builder(this.getContext());
AlertDialog alert = alt_bld.create();
alert.setTitle("Time is out. You lose.");
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
main.onBackPressed();
}});
alert.show();
}
}GameTimer类是一个线程:
public class GameTimer extends Thread{
private GameView gameView;
private boolean run;
public GameTimer(GameView gameView){
this.gameView = gameView;
}
public void setRunning(boolean value){
this.run = value;
}
public void run(){
Looper.prepare();
while (run){
try {
gameView.showTime();
sleep(1000);
} catch (Exception e){
e.printStackTrace();
}
}
Looper.loop();
}}
AlertDialog出现,但应用程序崩溃,并显示以下消息:只有创建视图层次结构的原始线程才能接触视图。但这条线创造了..。问题出在哪里?
发布于 2012-02-02 17:55:47
使用Handler或使用
this.runOnUiThread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
}
});错误本身就说明了整个故事。如果你不在Activity/ View的父类中,那么使用一些回调机制。这将帮助您解决您的问题。干杯。
发布于 2012-02-02 18:29:57
从您得到的错误判断,您正在将View对象从其他地方传递到Thread类构造函数,然后尝试使用它的方法来创建一个AlertDialog。不幸的是,这是行不通的。您需要使用Handler将消息(在本例中,time = 0)从线程发送回View类,在该类中定义了showTime()方法。定义处理程序,然后覆盖handleMesage()方法以调用showTime() methid。
下面的链接可以帮助你开始。http://developer.android.com/reference/android/os/Handler.html
https://stackoverflow.com/questions/9109882
复制相似问题