1. 程式人生 > >關於removeCallbacks不能移除訊息的問題

關於removeCallbacks不能移除訊息的問題

關於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);
    }

總結

上面是通過實驗的方式去探究問題,並沒有關鍵原始碼支援,如果有大佬瞭解這塊內容,希望告知小弟,謝謝。