我正在使用
我的问题是,在时间到期之前,我找不到一种方法来取消 postDelayed 任务。
handler.postDelayed()
函数来创建应用程序下一阶段之前的等待时间。在等待期间,我会显示一个带有进度条和“取消”按钮的对话框。我的问题是,在时间到期之前,我找不到一种方法来取消 postDelayed 任务。
handler.postDelayed()
函数来创建应用程序下一阶段之前的等待时间。在等待期间,我会显示一个带有进度条和“取消”按钮的对话框。我这样做是为了发布一个延迟的可运行对象:
myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH);
要移除它,可以使用以下代码:myHandler.removeCallbacks(myRunnable);
如果您有多个内部/匿名运行任务传递给同一个处理程序,并且希望在同一事件中取消所有任务,请使用
handler.removeCallbacksAndMessages(null);
根据文档,
删除任何待处理的回调和已发送消息,其obj为token。如果token为null,则将删除所有回调和消息。
removeCallbacks(callback)
来删除特定的回调。 - FindOutIslamNow另一种方法是直接处理Runnable本身:
Runnable r = new Runnable {
public void run() {
if (booleanCancelMember != false) {
//do what you need
}
}
}
r
),这意味着我可以使用myHandler.removeCallbacks(r);
。如果Runnable是匿名的,则标志将成为封闭类中的成员,这意味着我需要引用该对象来更改标志,这又意味着我仍然需要r
,这意味着我仍然可以使用myHandler.removeCallbacks(r);
。如果我正在执行myHandler.removeCallbacks(r);
,则根本不需要这样的标志。我有什么遗漏吗? - nacho4dpublic class DelayedAction {
private Handler _handler;
private Runnable _runnable;
/**
* Constructor
* @param runnable The runnable
* @param delay The delay (in milli sec) to wait before running the runnable
*/
public DelayedAction(Runnable runnable, long delay) {
_handler = new Handler(Looper.getMainLooper());
_runnable = runnable;
_handler.postDelayed(_runnable, delay);
}
/**
* Cancel a runnable
*/
public void cancel() {
if ( _handler == null || _runnable == null ) {
return;
}
_handler.removeCallbacks(_runnable);
}}
当我通过布尔值将CancelCallBacks(this)在postDelayed可运行程序中调用时,它对我起作用了
Runnable runnable = new Runnable(){
@Override
public void run() {
Log.e("HANDLER", "run: Outside Runnable");
if (IsRecording) {
Log.e("HANDLER", "run: Runnable");
handler.postDelayed(this, 2000);
}else{
handler.removeCallbacks(this);
}
}
};