12

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

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

4

3 回答 3

36

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

于 2009-12-28T18:15:49.137 回答
6

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

private Runnable lastMyRunnablePtr = null;

...

private class MyRunnable implements Runnable
{}

……

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

……

protected void onDestroy() {
  mHandler.removeCallbacks(lastMyRunnablePtr);
}
于 2011-08-02T09:08:22.003 回答
1

实际上,您应该考虑handler.removeMessages(int, obj). 如果 obj 是与自动装箱相关的对象,就会遇到 android 的实现问题MessageQueue

对于以下代码片段,由于自动装箱、装箱转换和使用 p.obj == 对象比较对象的 MessageQueue 实现,removeMessages 将不起作用。

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

参考这篇文章

于 2017-06-12T02:49:51.797 回答