Looper.prepare () с AlertDialog - PullRequest
       5

Looper.prepare () с AlertDialog

0 голосов
/ 02 февраля 2012

Я хотел бы вставить счетчик времени в игру.Если время равно 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появляется, но приложение вылетает с сообщением: только исходный поток, создавший иерархию представлений, может касаться представлений.Но это нить, которая создала ... Где проблема?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Сделайте это с помощью обработчика или используйте

this.runOnUiThread(new Runnable() {

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

        }
    });

Ошибка сама рассказывает всю историю. А если вы не находитесь в родительском классе Activity / View, используйте какой-нибудь обратный вызов Mechnasim. Это поможет вам решить вашу проблему. Приветствия.

1 голос
/ 02 февраля 2012

Судя по получаемой ошибке, вы передаете свой объект View в конструктор класса Thread откуда-то еще, а затем пытаетесь использовать его метод для создания AlertDialog.К сожалению, это не сработает.Вам нужно использовать Handler для отправки сообщения (в вашем случае time = 0) из вашего потока в ваш класс View, где вы определили метод showTime ().Определите обработчик, а затем переопределите метод handleMesage (), чтобы вызвать свой метод showTime ().

Ссылка ниже может помочь вам начать работу.http://developer.android.com/reference/android/os/Handler.html

...