如何在到达处理程序之前删除延迟的消息?

时间:2009-12-28 16:13:21

标签: android handler messages

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

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

3 个答案:

答案 0 :(得分:36)

removeMessages()方法没有什么可怕的;他们非常安全。框架在很大程度上依赖于这些方法,并且它们在很多地方使用,特别是在默认小部件中(ViewListView等)。这比构建Handler要好得多。忽略特定的消息。这是编程,不要随你的感受:p

答案 1 :(得分:5)

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

private Runnable lastMyRunnablePtr = null;

...

private class MyRunnable implements Runnable
{}

...

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

...

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

答案 2 :(得分:1)

实际上,您应该考虑handler.removeMessages(int, obj)的实施。如果obj是与autoboxing相关的对象,则会遇到android MessageQueue的实现问题。

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

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

参考此post