Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何停止处理程序的递归调用?_Java_Android_Handler - Fatal编程技术网

Java 如何停止处理程序的递归调用?

Java 如何停止处理程序的递归调用?,java,android,handler,Java,Android,Handler,我创建了一个处理程序来模拟计时器任务。 因为TimerTask在不同的平板电脑上表现不同。 所以我创建了这个处理程序方法。 在timer中有一个方法timerTask.cancel() 但是如何阻止这个处理器呢 即使在退出应用程序后,它仍会继续运行。 正如您所看到的,即使在背压之后,日志仍在运行 Handler handler = new Handler(); public void recursivelycallHandler(){ handler.postDelayed(new R

我创建了一个处理程序来模拟计时器任务。 因为TimerTask在不同的平板电脑上表现不同。 所以我创建了这个处理程序方法。 在timer中有一个方法
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);
}

您可以存储标志(布尔值)以检测是否需要调用处理程序,并在退出应用程序之前将此标志更改为false并停止调用处理程序。

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

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

在你的情况下,前两个似乎是可行的。。在ondestroy中或在侦听器上向backpress添加上述任何方法

您可以执行如下操作:

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

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

        }
    }, 100);
}
希望你明白我的意思


请随意评论。

只需将isFinished添加到您的跑步方法中即可:

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

    }
}, 100);

通过提出任何条件

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对象,而不是递归方法,并根据特定情况/条件删除该对象,而您要停止它吗?我的意思是任何条件?如果您只想在应用程序接近时停止,那么只需将override方法放在stroy上,并在此时删除处理程序的回调。如果您仍然没有得到解决方案,那么让我评论一下您遇到的困难。这很有效。。。谢谢我将在5分钟内接受您的回答,因为stackoverflow不允许我现在这样做。我建议调用removeCallback以避免泄漏
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);