У меня есть расширенный диалоговый класс, который я хочу показать в течение 3 секунд, затем исчезнет. Это отлично работает первые два раза, когда он вызывал, но после этого он сбрасывает мое приложение после этого. По общему признанию, я не самый лучший с потоками, и я думаю, что там, где может быть моя проблема. Как вы можете видеть из приведенного ниже кода (прокомментированный раздел), я попытался использовать событие cancel для уничтожения нити, которая была создана, но это приводит к сбою при первом запуске. Я также попытался сделать все это в потоке пользовательского интерфейса родительского класса, который дает тот же результат, что и этот (сбой после трехкратного отображения диалогового окна).
import java.util.Timer;
import java.util.TimerTask;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
public class HandResults extends Dialog implements DialogInterface {
HandResults hr;
Timer myTimer;
Handler hand = new Handler();
Thread t;
public HandResults(Context context) {
super(context);
setContentView(R.layout.handresults);
hr = this;
/*
this.setOnCancelListener(new OnCancelListener(){
public void onCancel(DialogInterface dialog) {
t.destroy();
}
});
*/
}
public void showHands(){
this.show();
myTimer = null;
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
TimerMethod();
}
}, 3000);
}
private void TimerMethod()
{
t = new Thread(){
public void run(){
hand.post(Timer_Tick);
}
};
t.start();
}
private Runnable Timer_Tick = new Runnable() {
public void run() {
hr.cancel();
}
};
}
onCancel
получено, вы вызываете t.destroy()
, а destroy
- устаревший метод.Так что это может работать лучше:
public class HandResults extends Dialog implements DialogInterface {
HandResults hr;
Timer myTimer;
Handler hand = new Handler();
public HandResults(Context context) {
super(context);
setContentView(R.layout.handresults);
hr = this;
}
public void showHands(){
this.show();
myTimer = null;
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
hr.cancel(); // call the cancel method directly
}
}, 3000);
}
}
Нет необходимости создавать свой собственный поток, поэтому приведенный выше код должен делать примерно то, что вы пытаетесь сделать.
Здесь вам не нужно лечить t, вы можете запустить hand.post() внутри TimerTask. И даже TimerTask/Timer не требуется, вы можете использовать handler.postDelayed(). Я не знаю, откуда взялось поведение, которое вы наблюдаете. Кроме того, вы должны учитывать, что ваш диалог закрыт раньше (например, когда использование поворачивает экран). Вы можете вызвать handler.removeCallbacks() в этом случае.