如何阻止Handler的递归调用?

时间:2013-01-24 13:13:42

标签: java android handler

我创建了一个处理程序,模仿计时器任务。 因为TimerTask在不同的平板电脑上表现不同。 所以我创建了这个处理程序方法 在计时器中有一个方法timerTask.cancel(); 但是如何阻止这个处理程序 即使在退出应用程序后它也会继续运行。 因为你可以看到即使在背压后也能运行日志。

Handler handler = new Handler();

public void recursivelycallHandler(){
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            Log.d("handler is running", "true" + System.currentTimeMillis());
            recursivelycallHandler();

        }
    }, 100);
}

5 个答案:

答案 0 :(得分:2)

有3种方法可以做到这一点..

handler.removeCallbacks(Runnable r);
handler.removeCallbacksAndMessages(null);
handler.removeMessages(int what)

在你的情况下,前两个似乎是可行的..在ondestroy或者一个监听器上添加任何上述方法来进行反击..

答案 1 :(得分:0)

你可以存储flag(boolean var)来检测你是否需要调用你的处理程序,并在退出应用程序之前将此标志更改为false并停止调用处理程序。

答案 2 :(得分:0)

你可以在下面做这样的事情:

   public void recursivelycallHandler(){
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            Log.d("handler is running", "true" + System.currentTimeMillis());
            if(YOUR_CONDITION){
               recursivelycallHandler();
            }

        }
    }, 100);
}

希望你明白我的意思。

随时发表评论。

答案 3 :(得分:0)

只需将isFinished添加到您的run方法:

    handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if (isFinished())
               return;
        Log.d("handler is running", "true" + System.currentTimeMillis());
        recursivelycallHandler();

    }
}, 100);

答案 4 :(得分:0)

通过提出任何条件

Handler handler = new Handler();
int i = 0;
Runnable myRunnable = new Runnable() {
        @Override
        public void run() {

            Log.d("handler is running", "true" + System.currentTimeMillis());
            if(i>5)
               handler.removeCallback(myRunnable);
            else{
                i++;
                handler.postDelayed(myRunnable, 100); // here is self calling
            }

        }
    };
}
handler.postDelayed(myRunnable, 100);

它的递归方法,但是您可以在run()中调用相同的Runnable对象而不是递归方法,并在基于特定情况/条件时删除该对象