如何从处理程序中删除所有回调?

新手上路,请多包涵

我的子 Activity 有一个 Handler ,它由主 Activity 调用。这个 Handler 被子类使用到 postDelay 一些 Runnables,我无法管理它们。现在,在 onStop 事件中,我需要在完成 Activity 之前删除它们(不知何故,我调用了 finish() ,但它仍然一次又一次地调用)。无论如何要从处理程序中删除所有回调?

原文由 Luke Vo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 493
2 个回答

根据我的经验,这很有效!

 handler.removeCallbacksAndMessages(null);

在 removeCallbacksAndMessages 的文档中,它说…

删除所有待处理的回调和发送的消息,其 obj 是令牌。 如果 token 是 null ,所有回调和消息将被删除。

原文由 josh527 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于任何特定的 Runnable 实例,调用 Handler.removeCallbacks() 。请注意,它使用 Runnable 实例本身来确定要注销哪些回调,因此如果您在每次发布帖子时都创建一个新实例,则需要确保引用了确切的 Runnable 取消。例子:

 Handler myHandler = new Handler();
Runnable myRunnable = new Runnable() {
    public void run() {
        //Some interesting task
    }
};

您可以调用 myHandler.postDelayed(myRunnable, x) 将另一个回调发布到代码中其他位置的消息队列,并删除所有挂起的回调 myHandler.removeCallbacks(myRunnable)

不幸的是,您不能简单地“清除”整个 MessageQueue 对于 Handler ,即使您请求 MessageQueue 与之相关联的方法——对象添加和删除项目是受包保护的(只有 android.os 包中的类可以调用它们)。您可能必须创建一个薄的 Handler 子类来管理 Runnable 的列表,因为它们已发布/执行……或者查看另一种范例,以便在每个 Activity

希望有帮助!

原文由 devunwired 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题