版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shayubuhuifei/article/details/73369281
关于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);
}
总结
上面是通过实验的方式去探究问题,并没有关键源码支持,如果有大佬了解这块内容,希望告知小弟,谢谢。