如何删除从postDelayed添加一个处理程序对象可运行?
-
26-09-2019 - |
题
我有一个的 “开放的”强>动画和正在使用Handler.postDelayed(Runnable, delay)
触发的 “关闭”强>一个短暂的延迟后的动画。然而,在打开和关闭之间的时间,有可能通过点击触发的另一个动画。
我的问题是,如何将我取消的 “关闭”在处理动画?
解决方案
其他提示
克里斯蒂安的答案是正确的,但相对于什么是答案的评论指出,实际上,你可以通过调用Runnables
删除匿名removeCallbacksAndMessages(null);
回调
如上所述此处:
移除回调任何未决帖子和发送的消息,其obj是令牌。 如果令牌为空,所有回调和消息将被删除强>
这是一个迟到的回答,但这里的,因为当你只想从处理程序中移除可运行的特定类别(即在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())令牌,所以最好使用整数/整数,而不是字符串的令牌。
如果您使用递归,您可以通过传递“这个”达致这。请参见下面的代码。
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的和禁用倒计时。这仅仅是谁在使用递归有用的人,但我来到这里寻找那个,所以我张贴我的结果。
如果您要删除的回调一个匿名的Runnable只需运行:
handler = null
一切都将被删除。
不隶属于 StackOverflow