0

ゲーム内にタイムカウンターを入れたいのですが。時間が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が表示されますが、アプリがクラッシュし、次のメッセージが表示されます。ビュー階層を作成した元のスレッドのみがビューにアクセスできます。しかし、これは作成したスレッドです...問題はどこにありますか?

4

2 に答える 2

2

ハンドラーまたは使用を使用してこれを行う

this.runOnUiThread(new Runnable() {

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

        }
    });

エラー自体が全体像を物語っています。また、Activity / ViewのParentクラスにいない場合は、コールバックMechnasimを使用してください。これは、問題の解決に役立ちます。乾杯。

于 2012-02-02T09:55:46.890 に答える
1

発生しているエラーから判断すると、Viewオブジェクトを別の場所からThreadクラスコンストラクターに渡し、そのメソッドを使用してAlertDialogを作成しようとしています。残念ながら、これは機能しません。Handlerを使用して、メッセージ(この場合はtime = 0)をスレッドからViewクラスに送り返す必要があります。ここでは、showTime()メソッドを定義しています。ハンドラーを定義してから、handleMesage()メソッドをオーバーライドして、showTime()メソッドを呼び出します。

以下のリンクはあなたが始めるのを助けることができます。 http://developer.android.com/reference/android/os/Handler.html

于 2012-02-02T10:29:56.577 に答える