取消handler.postdelayed进程

Ron*_*Ron 247 android postdelayed android-handler

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

我的问题是我找不到在时间流逝之前取消postDelayed任务的方法.

Var*_*run 463

我这样做是为了发布延迟的runnable:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 
Run Code Online (Sandbox Code Playgroud)

这要删除它: myHandler.removeCallbacks(myRunnable);

  • 如果你有能力取消处理程序上的所有回调和消息,并且不想继续引用runnable,那么这个问题的接受答案中的第三点是另一种似乎对我的案例有用的替代方案:http: //stackoverflow.com/questions/11299440/onbackpressed-to-kill-a-handler-within-an-activity-android(基本上调用myHandler.removeCallbacksAndMessages(null);) (71认同)

Man*_*ani 51

如果你有多个内部/匿名runnables传递给同一个处理程序,并且你想在相同的事件使用时取消所有

handler.removeCallbacksAndMessages(null);

根据文件,

删除任何待处理的回调帖子并发送其obj为令牌的邮件.如果token为null,则将删除所有回调和消息.


cod*_*ber 18

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

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

  • booleanCancelMember不会是最终的,这意味着它无法更改,因此无用吗? (14认同)
  • @stealthcopter没有它不必. (9认同)
  • @pablisco即使Runnable是匿名的,它也不一定是最终的.它可以是封闭类中的成员. (7认同)
  • 不要低估这一点,但要小心.使用这种方法,如果多个Runnables被延迟发布,您可能会遇到令人讨厌的竞争条件.这不会取消Runnable,因此该代码是否将被执行取决于**每个**发布的Runnable在特定时刻的booleanCancelMember的值.这可能很快变得不可预测. (6认同)