如何从postDelayed添加的处理程序对象中删除runnable?

我有一个“打开”animation,并使用Handler.postDelayed(Runnable, delay)在短暂的延迟后触发“closures”animation。 但是,在打开和closures之间的时间内,可能还有另一个点击触发的animation。

我的问题是,我将如何取消处理程序中的“closures”animation?

只需使用removeCallbacks(Runnable r)方法即可。

Cristian的回答是正确的,但与答案的评论中所述的相反,实际上可以通过调用removeCallbacksAndMessages(null);来移除匿名Runnables的callbackremoveCallbacksAndMessages(null);

如此处所述:

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

如果你使用recursion,你可以通过传递“this”来达到目的。 看下面的代码。

 public void countDown(final int c){ mHandler.postDelayed(new Runnable() { @Override public void run() { aq.id(R.id.timer).text((c-1)+""); if(c <= 1){ aq.id(R.id.timer).gone(); mHandler.removeCallbacks(this); }else{ countDown(c-1); } } }, 1000); } 

这个例子将每秒设置一个TextView(定时器)的文本,倒计时。 一旦达到0,它将从UI中删除TextView并禁用倒计时。 这只对使用recursion的人有用,但我到了这里寻找,所以我张贴我的结果。

这是一个迟到的答案,但是这里有一个不同的方法,当你只想从处理程序中删除一个特定类别的runnables(例如,在OP的情况下,只是删除closures的animation,留下队列中的其他runnables):

  int firstToken = 5; int secondToken = 6; //r1 to r4 are all different instances or implementations of Runnable. mHandler.postAtTime(r1, firstToken, 0); mHandler.postAtTime(r2, firstToken, 0); mHandler.postAtTime(r3, secondToken, 0); mHandler.removeCallbacksAndMessages(firstToken); mHandler.postAtTime(r4, firstToken, 0); 

上面的代码只会执行“r3”,然后执行“r4”。 这使您可以删除由您的令牌定义的特定类别的可运行内容,而无需保留对可运行对象本身的任何引用。

注意:源代码仅使用“==”操作数(它不调用.equals())来比较标记,所以最好使用ints / Integers而不是string作为标记。