我有一个“打开”动画,并在短暂延迟后Handler.postDelayed(Runnable, delay)
用于触发“关闭”动画。但是,在打开和关闭之间的时间内,单击可能会触发另一个动画。
我的问题是,如何取消处理程序中的“关闭”动画?
Answers:
只需使用该removeCallbacks(Runnable r)
方法即可。
克里斯蒂安(Cristian)的答案是正确的,但是与答案的注释相反,您实际上可以Runnables
通过调用来删除匿名的回调removeCallbacksAndMessages(null);
如前所述这里:
删除obj为令牌的回调和已发送消息的所有未决帖子。如果token为null,则将删除所有回调和消息。
Handler
AView
类还是类,这种行为都是不同的。在一个View
类中(也许在4.0之后?),您必须使用相同的Runnable
对象来取消任务,而对于一个Handler
类,如果您通过,它们将全部被取消null
。但是,问题指定了一个,Handler
因此您的答案是正确的。
这是一个较晚的答案,但是当您只想从处理程序中删除特定类别的可运行对象时(例如,在OP的情况下,只需删除关闭动画,而将其他可运行对象保留在队列中),这是另一种方法:
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()),因此最好使用int / Integers而不是字符串作为令牌。
如果您使用递归,则可以通过传递“ 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并禁用倒计时。这仅对使用递归的人有用,但是我到达这里是为了进行搜索,因此我将发布结果。