关于removeCallbacks不能移除消息的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
    }

总结

上面是通过实验的方式去探究问题,并没有关键源码支持,如果有大佬了解这块内容,希望告知小弟,谢谢。

猜你喜欢

转载自blog.csdn.net/shayubuhuifei/article/details/73369281