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

时间:2010-09-02 12:48:02

标签: android handler runnable postdelayed

我有“打开”动画,并且在短暂延迟后使用Handler.postDelayed(Runnable, delay)触发“关闭”动画。但是,在打开和关闭之间的时间内,可能会出现另一个由点击触发的动画。

我的问题是,如何取消处理程序中的“关闭”动画?

5 个答案:

答案 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 一切都会被删除。