Android处理程序删除发送消息不起作用

时间:2015-05-25 05:25:46

标签: android handler

Android处理程序从处理程序消息队列中删除先前的发送消息。 记住我不想使用tableRemovedremoveCallbacks r);

发送广播意图
- 发送消息

Runnable

- 取消之前的任何讯息

      Intent i = new Intent(my_action);  
      sendBroadcast(i);  

但此后Intent i = new Intent(my_action); i.putExtra("a","a"); sendBroadcast(i); public class TestBroadCast extends BroadcastReceiver { Handler h = new Handler(){ @Override public void handleMessage(Message msg) { // Do my stuff } }; Message msg = h.obtainMessage(); @Override public void onReceive(Context context, Intent intent) { if ("a".equals(intent.getStringExtra("a"))){ // Handle intent to cancel message msg.what = 1; h.removeMessages(1); } else { // Handle intent to do my stuff msg.what = 1; h.sendMessageDelayed(msg, 10000); } } } 无效。

2 个答案:

答案 0 :(得分:1)

你不能重复使用bootstrap-rails过去尝试过的Message并且它不起作用,你应该获得一个新的。{/ p>

卸下:

Message msg = h.obtainMessage();

修改:

else { 
        // Handle intent to do my stuff 
        Message msg = h.obtainMessage();
        msg.what = 1;
        h.sendMessageDelayed(msg, 10000);
    } 

你也应该让你的Handler静态,我怀疑这是你的问题的原因。 BroadcastReceiver可能是短暂的生命,并且在你的处理程序触发之前被创建和销毁。

答案 1 :(得分:0)

您应将处理程序移至Application类,原因如下:

您的BroadcastReceiver每次在广播后都会创建多个处理程序实例,因此Message.target分配了与h.obtainMessage()不同的Handler实例。因此,在选中Message.target之后,Handler.removeMessages()将无法删除消息。 以下是有关Messagequeue.removeMessages()和检查目标处理程序的相关源代码:

while (p != null && p.target == h && p.what == what
   && (object == null || p.obj == object)) {
   Message n = p.next;
   mMessages = n;
   p.recycleUnchecked();
   p = n;
}