0

我想在游戏中插入一个计时器。如果时间为 0,则会有一个 AlertDialog 告诉用户时间已到,并返回到上一个 Activity。这是方法(它在扩展 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,但应用程序崩溃,并显示以下消息:只有创建视图层次结构的原始线程才能触摸视图。但这是创建的线程......问题出在哪里?

4

2 回答 2

2

使用 Handler 或 Use 执行此操作

this.runOnUiThread(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub

        }
    });

错误本身说明了整个故事。如果您不在 Activity/View 的父类中,请使用一些回调 Mechnasim。这将帮助您解决问题。干杯。

于 2012-02-02T09:55:46.890 回答
1

从你得到的错误来看,你正在将你的 View 对象从其他地方传递给 Thread 类构造函数,然后尝试使用它的方法来创建一个 AlertDialog。不幸的是,这不起作用。您需要使用 Handler 将消息(在您的情况下,时间 = 0)从您的线程发送回您的 View 类,您已在其中定义了 showTime() 方法。定义处理程序,然后覆盖 handleMesage() 方法以调用您的 showTime() 方法。

下面的链接可以帮助您入门。 http://developer.android.com/reference/android/os/Handler.html

于 2012-02-02T10:29:56.577 回答