如何停止TimerTask处理程序?

时间:2013-02-04 18:18:58

标签: android handler timertask

我正在尝试停止Timer或TimerTask,但该方法不会破坏任务......

首先是我如何设置timertask的代码:

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

t = new Timer();     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);
    }
};

private Runnable runnable = new Runnable() { public void run() { // // Do the stuff // handler.postDelayed(this, 1000); } };

并停止:

handler.removeCallbacks(runnable);

取自这里:

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

3 个答案:

答案 0 :(得分:1)

在查看您的编辑后,我唯一建议的是使用handler.post(runnable);而不是runnable.run();这样,您总是在单独的线程上执行runnable。否则,您的第一次执行将在主线程上运行,然后将来的执行在一个单独的线程上的处理程序内运行。

    final Handler handler = new Handler();

    Runnable runnable = new Runnable() {

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

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

    handler.post(runnable);

答案 1 :(得分:0)

在将TimerTask设置为null之前取消它。

scanTask.cancel();

答案 2 :(得分:0)

此示例启动定时器unitl销毁

 private lateinit var timerTask: TimerTask

 timerTask = object : TimerTask() {
        override fun run() {
            Log.d("KTZ", "$minutes:$seconds");
            timeRecordingLiveData.postValue("$minutes:$seconds")
            seconds += 1;
            if (seconds == 60) {
                Log.d("KTZ", "$minutes:$seconds");
                timeRecordingLiveData.postValue("$minutes:$seconds")
                seconds = 0;
                minutes += 1;
            }
        }

    }

取消onDestroy()中的timertask

    timerTask.cancel()