【发布时间】:2009-12-28 16:13:20
【问题描述】:
我的问题是我需要延迟 1 秒发送消息。然后处理程序启动一些操作,您将获得图片。
在某些情况下,应该删除已发送的消息(在第二个过去之前)以防止处理程序执行任何操作。我无法弄清楚如何做到这一点(或者甚至可能),所以如果你们中的任何人有线索,请告诉我..
【问题讨论】:
我的问题是我需要延迟 1 秒发送消息。然后处理程序启动一些操作,您将获得图片。
在某些情况下,应该删除已发送的消息(在第二个过去之前)以防止处理程序执行任何操作。我无法弄清楚如何做到这一点(或者甚至可能),所以如果你们中的任何人有线索,请告诉我..
【问题讨论】:
removeMessages() 方法并不可怕;他们是完全安全的。该框架严重依赖这些方法,并且它们在很多地方都有使用,尤其是在默认小部件中(View、ListView 等)。这比构建忽略特定消息的Handler 要好得多。这是编程,不要随心所欲:p
【讨论】:
许多开发人员和您会发现的大部分源代码都会显示人们将匿名函数传递给处理程序,因此我认为在某些情况下您可能不确定如何删除这些函数。一个简单的解决方案是像声明任何其他对象一样声明您的可运行对象,并保留一个指向它的指针,该指针可用于从处理程序队列中清除它的任何实例。
private Runnable lastMyRunnablePtr = null;
...
private class MyRunnable implements Runnable
{}
....
lastMyRunnablePtr = new MyRunnable();
mHandler.postDelayed(lastMyRunnablePtr ,30000);
....
protected void onDestroy() {
mHandler.removeCallbacks(lastMyRunnablePtr);
}
【讨论】:
其实你应该考虑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。
【讨论】: