Android 处理程序删除发送消息不工作
Android handler remove send message not working
Android 处理程序从处理程序消息队列中删除先前发送的消息。 记住我不想用removeCallbacks
(Runnable
r);
发送广播意图
- 发送消息
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);
}
}
}
但此后 removeMessages
不起作用。
你不能重复使用 Message
我过去试过但没用,你应该买一个新的。
删除:
Message msg = h.obtainMessage();
修改:
else {
// Handle intent to do my stuff
Message msg = h.obtainMessage();
msg.what = 1;
h.sendMessageDelayed(msg, 10000);
}
您还应该使 Handler
静态化,我怀疑这就是您出现问题的原因。 BroadcastReceiver
的生命周期可能很短,会在您的处理程序触发之前创建和销毁。
您应该将处理程序移至应用程序 class,原因如下:
您的 BroadcastReceiver 在每次广播后创建多个处理程序实例,因此 Message.target 从 h.obtainMessage() 分配了不同的处理程序实例。因此,Handler.removeMessages() 将无法在检查 Message.target 后删除消息。
这是 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;
}
Android 处理程序从处理程序消息队列中删除先前发送的消息。 记住我不想用removeCallbacks
(Runnable
r);
发送广播意图
- 发送消息
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);
}
}
}
但此后 removeMessages
不起作用。
你不能重复使用 Message
我过去试过但没用,你应该买一个新的。
删除:
Message msg = h.obtainMessage();
修改:
else {
// Handle intent to do my stuff
Message msg = h.obtainMessage();
msg.what = 1;
h.sendMessageDelayed(msg, 10000);
}
您还应该使 Handler
静态化,我怀疑这就是您出现问题的原因。 BroadcastReceiver
的生命周期可能很短,会在您的处理程序触发之前创建和销毁。
您应该将处理程序移至应用程序 class,原因如下:
您的 BroadcastReceiver 在每次广播后创建多个处理程序实例,因此 Message.target 从 h.obtainMessage() 分配了不同的处理程序实例。因此,Handler.removeMessages() 将无法在检查 Message.target 后删除消息。 这是 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;
}