отменить диалог через 3 секунды - продолжает сбой моего приложения после многократного использования - PullRequest
1 голос
/ 21 августа 2010

У меня расширенный класс диалога, который я хочу показать в течение 3 секунд, а затем исчезнуть.Это прекрасно работает в первые два раза, как это называется, но затем он вылетает мое приложение после этого.По общему признанию, я не лучший с потоками, и я думаю, что это, где моя проблема может быть.Как вы можете видеть из приведенного ниже кода (закомментированный раздел), я пытался использовать событие отмены для уничтожения порожденного потока, но это приводит к его аварийному завершению при первом запуске.Я также попытался сделать все это в потоке пользовательского интерфейса родительского класса, который дает тот же результат, что и этот (происходит сбой после 3 раз при отображении диалогового окна).

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();
        }
    };
}

Ответы [ 2 ]

4 голосов
/ 22 августа 2010
  1. При получении события onCancel вы вызываете t.destroy(), а destroy является устаревшим методом.
  2. Вам не нужно запускать другой поток, если вы создаететаймер, который уже работает асинхронно.

Так что это может работать лучше:

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);
    }
}

Нет необходимости создавать свой собственный поток, поэтому приведенный выше код должен примерноты пытаешься сделать.

0 голосов
/ 22 августа 2010

Здесь вам не нужно ничего обрабатывать, вы можете запустить hand.post () внутри TimerTask. И даже TimerTask / Timer не нужен, вы можете использовать handler.postDelayed (). Я не знаю, откуда происходит поведение, которое вы наблюдаете. Кроме того, вы должны учитывать, что ваш диалог закрывается рано (например, когда пользователь поворачивает экран). В этом случае вы можете вызвать handler.removeCallbacks ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...