【问题标题】:How to delete delayed messages before they arrive at a Handler?如何在延迟消息到达处理程序之前删除它们?
【发布时间】:2009-12-28 16:13:20
【问题描述】:

我的问题是我需要延迟 1 秒发送消息。然后处理程序启动一些操作,您将获得图片。

在某些情况下,应该删除已发送的消息(在第二个过去之前)以防止处理程序执行任何操作。我无法弄清楚如何做到这一点(或者甚至可能),所以如果你们中的任何人有线索,请告诉我..

【问题讨论】:

    标签: android handler messages


    【解决方案1】:

    removeMessages() 方法并不可怕;他们是完全安全的。该框架严重依赖这些方法,并且它们在很多地方都有使用,尤其是在默认小部件中(ViewListView 等)。这比构建忽略特定消息的Handler 要好得多。这是编程,不要随心所欲:p

    【讨论】:

    • 如果有更多关于这些方法的文档,如果 'what' 参数在所有排队机制(例如 postRunnable())上可用,如果 'what' 和 'token 之间的区别' 更清晰,等等。如果我必须翻阅 Android 源代码来弄清楚 Handler 今天在做什么,这意味着我不能保证这种无证行为明天会保持一致。因此,恕我直言,removeMessages() 对开发人员来说很可怕。澄清这一点不需要太多,但我无法决定什么是适当的 Handler 行为,什么是不适当的 Handler 行为。
    • 你的最后一句话让我很开心,很明显。但除此之外,我也同意commonsaware,该领域的文档确实不足,也许我应该提交一张票。
    • 当您发布 Runnable 时没有理由有“什么”,您只需为此使用 removeCallback()。文档中究竟不能保证什么?
    【解决方案2】:

    许多开发人员和您会发现的大部分源代码都会显示人们将匿名函数传递给处理程序,因此我认为在某些情况下您可能不确定如何删除这些函数。一个简单的解决方案是像声明任何其他对象一样声明您的可运行对象,并保留一个指向它的指针,该指针可用于从处理程序队列中清除它的任何实例。

    private Runnable lastMyRunnablePtr = null;
    

    ...

    private class MyRunnable implements Runnable
    {}
    

    ....

    lastMyRunnablePtr = new MyRunnable();
    mHandler.postDelayed(lastMyRunnablePtr ,30000);
    

    ....

    protected void onDestroy() {
      mHandler.removeCallbacks(lastMyRunnablePtr);
    }
    

    【讨论】:

      【解决方案3】:

      其实你应该考虑handler.removeMessages(int, obj)的实现。如果obj是自动装箱相关的对象,就会遇到androidMessageQueue的实现问题。

      对于以下代码 sn-p,由于自动装箱、boxing-conversion 和使用 p.obj == object 比较对象的 MessageQueue 实现,removeMessages 将不起作用。

      Message msg = handler.obtainMessage(what, 256);
      handler.sendMessageDelayed(message, delayMillis);
      handler.removeMessages(what, 256);
      

      请参考post

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多