2

Timer または TimerTask を停止しようとしていますが、メソッドはタスクを破棄しません...

まず、タイマータスクを設定するコード:

 scanTask = new TimerTask() {
    public void run() {
            handler.post(new Runnable() {
                    public void run() {
                     load_unread();
                     Log.d("TIMER", "Timer set off");
                    }
           });
    }};

t=新しいタイマー(); t.schedule(scanTask, 300, 10000);

そして今、onDestroy でこのタスクを「強制終了」しようとしています。

@Override
protected void onDestroy() {
    super.onDestroy();
    scanTask.cancel();
    t.cancel();
    t.purge();
    handler.removeCallbacksAndMessages(null);
    System.out.println("Chat destroyed");
}

しかし、これはうまくいきませんか?解決策を見つけるのを手伝ってもらえますか?

ありがとう!

編集:私はついに答えを見つけました。なぜ私のものがうまくいかなかったのかわかりません...

これは、同じ問題を抱えているすべての人のためのコードです。とにかく、これはより優れたより効率的なソリューションだと思います:

private Handler handler = new Handler(); runnable.run();

private Runnable runnable = new Runnable() 
{

    public void run() 
    {
         //
         // Do the stuff
         //

         handler.postDelayed(this, 1000);
    }
};

そして停止するには:

handler.removeCallbacks(runnable);

ここから取得:

https://stackoverflow.com/a/11640073/1956197

4

3 に答える 3

2

あなたの編集を見た後、私が提案する唯一のことは、handler.post(runnable);代わりに使用することですrunnable.run();。この方法では、常に別のスレッドで実行可能ファイルを実行しています。それ以外の場合、最初の実行はメイン スレッドで実行され、その後の実行は別のスレッドのハンドラー内で実行されます。

    final Handler handler = new Handler();

    Runnable runnable = new Runnable() {

        public void run() {
            //
            // Do the stuff
            //

            handler.postDelayed(this, 1000);
        }
    };

    handler.post(runnable);
于 2013-02-05T17:45:30.607 に答える
0

null に設定する前に TimerTask をキャンセルします。

scanTask.cancel();
于 2013-02-04T18:38:25.687 に答える