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

我有一个来自我主要活动调用的子活动的处理程序 。 这个处理程序被子类用来postDelay一些Runnables,我不能pipe理它们。 现在,在onStop事件中,我需要在完成活动之前删除它们(不知何故,我称之为finish(),但它仍然一次又一次地调用)。 无论如何删除处理程序的所有callback?

根据我的经验,这个工作很好!

handler.removeCallbacksAndMessages(null); 

在文档removeCallbacksAndMessages它说…

删除所有未完成的callbackpost,并发送obj为标记的消息。 如果令牌为null ,所有的callback和消息将被删除。

对于任何特定的Runnable实例,请调用Handler.removeCallbacks() 。 请注意,它使用Runnable实例本身来确定哪些callback要取消注册,所以如果每次创build一个post时都要创build一个新实例,则需要确保引用了要取消的确切Runnable 。 例:

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

您可以调用myHandler.postDelayed(myRunnable, x)在代码中的其他位置向消息队列发送另一个callback,并使用myHandler.removeCallbacks(myRunnable)删除所有未决的callback。

不幸的是,即使你向与之相关的MessageQueue对象发出一个请求,你也不能简单地“清除”一个Handler的整个MessageQueue ,因为用于添加和移除项目的方法是包保护的(只有android.os包中的类可以调用他们)。 您可能必须创build一个瘦Handler子类来pipe理Runnable的列表,因为它们被发布/执行……或者查看另一个范例,以便在每个Activity之间传递消息

希望帮助!

如果在第一个callback中没有Runnable引用,请获取消息的obj,然后使用removeCallbacksAndMessages()删除所有相关的callback。

定义一个新的处理程序和可运行的:

 private Handler handler = new Handler(Looper.getMainLooper()); private Runnable runnable = new Runnable() { @Override public void run() { // Do what ever you want } }; 

通话延迟:

 handler.postDelayed(runnable, sleep_time); 

从您的处理程序中删除您的callback:

 handler.removeCallbacks(runnable); 

其实这里有一点但非常重要的一点。 你应该第一次定义一个Handler和一个Runnable 。 实际上, removeCallbacks(runnable)可以正常工作,但如果每次定义它们,都可能无法处理它们。

虚假的方式:

  public class FooActivity extends Activity { private void handleSomething(){ Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { doIt(); } }; if(shouldIDoIt){ //doIt() works after 3 seconds. handler.postDelayed(runnable, 3000); } else { handler.removeCallbacks(runnable); } } public void onClick(View v){ handleSomething(); } } 

如果您调用onClick(..)方法,您在调用之前永远不会停止doIt()方法调用。 因为每次都会创buildnew Handlernew Runnable实例。 这样,您就失去了属于处理程序可运行实例的必要引用。

真正的方法:

  public class FooActivity extends Activity { Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { doIt(); } }; private void handleSomething(){ if(shouldIDoIt){ //doIt() works after 3 seconds. handler.postDelayed(runnable, 3000); } else { handler.removeCallbacks(runnable); } } public void onClick(View v){ handleSomething(); } } 

通过这种方式,您不会丢失实际的引用,并且removeCallbacks(runnable)可以成功removeCallbacks(runnable)

关键的句子是“在你的ActivityFragment中将它们定义为全局的”