关于removeCallbacks不能移除消息的问题
程序员文章站
2022-07-14 18:25:30
...
关于removeCallbacks不能移除消息的问题
开发中遇到一个问题,通过handler去post一个runnable的时候,进而循环去post,然后在页面销毁的时候去移除runnable的所有消息,发现调用了removeCallbacks方法不能生效的问题。
下面是代码:
runnable = new Runnable() {
@Override
public void run() {
Log.i("ddddd","ww"+runnable.getClass().getSimpleName());
}
};
Handler.postDelayed(runnable,1000);
Handler.sendEmptyMessage(2);
下面是消息的处理,下面两种方法都不行:
static android.os.Handler Handler= new Handler(
new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Handler.postDelayed(runnable,1000);
Handler.sendEmptyMessageDelayed(2,1000);
return false;
}
});
// ){
// @Override
// public void handleMessage(Message msg) {
// Handler.postDelayed(runnable,1000);
// Handler.sendEmptyMessageDelayed(2,1000);
// Handler.removeCallbacks(runnable);
// }
// };
然后去调用removeMessages方法居然可以,我表示很疑惑,去看了看源码,发现似乎移除的操作差不多,这里就很疑惑。
我尝试在handleMessage回调中去移除,发现是可以的,这大约可以表明,removeCallbacks方法调用的时机影响。
大概是调用removeCallbacks后才会调用handleMessage,导致消息循环并没有实际的停下来。
然后我去调用Handler.removeCallbacksAndMessages(runnable);也并不管用,然后在调用了Handler.removeCallbacksAndMessages(null);参数设置为null,这是发现整个的消息队列可以停下来了。
/**
* Remove any pending posts of callbacks and sent messages whose
* <var>obj</var> is <var>token</var>. If <var>token</var> is null,
* all callbacks and messages will be removed.
*参数为null会移除所有的callback和message
*/
public final void removeCallbacksAndMessages(Object token) {
mQueue.removeCallbacksAndMessages(this, token);
}
总结
上面是通过实验的方式去探究问题,并没有关键源码支持,如果有大佬了解这块内容,希望告知小弟,谢谢。
推荐阅读
-
关于消息中间件,我找了一些比较好玩的讨论主题,觉得对于深入理解一些技术问题非常有帮助
-
【Unity】关于UDP 客户端不能先给服务器发消息的问题
-
Oracle关于不能直接使用序列到insert select的问题
-
adb不是内部或外部命令,关于Android Studio中ADB命令不能用问题的解决办法
-
webpack关于CommonsChunkPlugin在高版本被移除的替代方案问题
-
关于go v1.11安装后出现不能正常运行测试程序的问题
-
关于c#(vs)dategridview控件继承不能修改的问题
-
关于请求方式为GET的form表单,action属性后不能带参数的问题讲解
-
关于Tomcat发布web项目时候不能发布的问题
-
关于removeCallbacks不能移除消息的问题