我有“打开”动画,并且在短暂延迟后使用Handler.postDelayed(Runnable, delay)
触发“关闭”动画。但是,在打开和关闭之间的时间内,可能会出现另一个由点击触发的动画。
我的问题是,如何取消处理程序中的“关闭”动画?
答案 0 :(得分:90)
只需使用removeCallbacks(Runnable r)
方法。
答案 1 :(得分:87)
Cristian的回答是正确的,但与答案的评论中所说的相反,您实际上可以通过调用Runnables
来删除匿名removeCallbacksAndMessages(null);
的回调
如上所述here:
删除任何待处理的回调帖子,并发送obj为令牌的邮件。 如果token为null,则将删除所有回调和消息。
答案 2 :(得分:11)
这是一个迟到的答案,但这里有一个不同的方法,当你只想从处理程序中删除特定类别的runnables时(即在OP的情况下,只需删除关闭动画,留下其他队列中的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"只要。这使您可以删除令牌定义的特定类别的runnable,而无需保留对runnable本身的任何引用。
注意:源代码使用" =="来比较令牌。仅操作数(它不调用.equals()),所以最好使用整数/整数而不是字符串作为标记。
答案 3 :(得分:10)
如果你使用递归,你可以通过传递“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并禁用倒计时。这仅对正在使用递归的人有用,但我到达这里搜索,所以我发布了我的结果。
答案 4 :(得分:-1)
如果要删除匿名Runnable的回调,请运行:
handler = null
一切都会被删除。