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

1

У меня есть расширенный диалоговый класс, который я хочу показать в течение 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();
        }
    };
}
  • 0
    Что за исключение?
Теги:
multithreading
timer
dialog

2 ответа

4
Лучший ответ
  • Когда событие 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);
    }
}

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

  • 0
    Я прокомментировал материал потока, я просто включил его в свой код, чтобы показать, что я пробовал это. В любом случае, ваш код делает то же, что и раньше, он работает 2 раза, затем приложение закрывается. Сейчас я попробовал это с помощью 3 других методов (handler.postDelayed, передавая runnable и обработчик из вызывающего метода и т. Д.), И у всех одинаковый результат ... он работает дважды, а затем завершается неудачей. Есть еще идеи?
  • 0
    Оказывается, что есть что-то еще, что заставляет его закрыться (в связи с этим). Я показываю это на основе результатов, которые поступают из сокета, и я предполагаю, что поток из класса сокетов, который я написал, здесь конфликтует ... Я не уверен, но когда я вынул это из уравнения Ваш код работает нормально. Поэтому я думаю, что мне нужно вернуться к чертежной доске и найти другой способ вызова метода showHands (): / Спасибо за вашу помощь.
Показать ещё 4 комментария
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню