取消一个处理程序。postdelayed过程

我正在使用handler.postDelayed()来创建一个等待期之前,我的应用程序的下一个阶段发生。在等待期间,我将显示一个带有进度条和取消按钮的对话框。

我的问题是我不能找到一个方法取消postDelayed任务之前的时间流逝。

111942 次浏览

我这样做是为了发布一个延迟的可运行文件:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH);

和这个来删除它:myHandler.removeCallbacks(myRunnable);

另一种方法是处理Runnable本身:

Runnable r = new Runnable {
public void run() {
if (booleanCancelMember != false) {
//do what you need
}
}
}

它为我工作,当我调用CancelCallBacks(this)在post delayed runnable通过一个布尔值传递它

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);
}
}
};

如果您确实有多个内部/匿名可运行程序传递给同一个处理程序,并且您希望在同一事件使用时取消所有可运行程序

handler.removeCallbacksAndMessages(null);

根据文件,

移除所有obj为的回调和已发送消息的挂起post 令牌。如果token为空,所有回调和消息将被删除

下面是一个为延迟操作提供取消方法的类

public 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);
}}