關於removeCallbacks不能移除訊息的問題
阿新 • • 發佈:2018-11-28
關於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);
}
總結
上面是通過實驗的方式去探究問題,並沒有關鍵原始碼支援,如果有大佬瞭解這塊內容,希望告知小弟,謝謝。