欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于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);
    }

总结

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