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