我正在使用handler.postDelayed()
在我的应用程序的下一个阶段发生之前创建一个等待期。在等待期间,我显示一个带有进度条和取消按钮的对话框。
我的问题是我找不到在时间流逝之前取消postDelayed任务的方法。
我这样做是为了发布延迟的runnable:
myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH);
这要删除它:myHandler.removeCallbacks(myRunnable);
如果你有多个内部/匿名runnables传递给同一个处理程序,并且你想在相同的事件使用时取消所有
handler.removeCallbacksAndMessages(null);
根据文件,
删除任何待处理的回调帖子,并发送obj为令牌的邮件。如果token为null,则将删除所有回调和消息。
另一种方法是处理Runnable本身:
Runnable r = new Runnable {
public void run() {
if (booleanCancelMember != false) {
//do what you need
}
}
}
当我通过一个布尔值处理它来延迟runnable的帖子中调用CancelCallBacks(this)时,它对我有用
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);
}
}
};
这是一个为延迟动作提供取消方法的类
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);
}}
希望这个要点帮助https://gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4
MainActivity作为具有处理程序和可运行功能的Screen Launcher,Runnable运行到登录页面或具有基本首选项登录用户和firebase的供稿页面。