Android中Looper的quit方法和quitSafely方法
Looper是通過呼叫loop方法驅動著訊息迴圈的進行: 從MessageQueue中阻塞式地取出一個訊息,然後讓Handler處理該訊息,周而復始,loop方法是個死迴圈方法。
那如何終止訊息迴圈呢?我們可以呼叫Looper的quit方法或quitSafely方法,二者稍有不同。
Looper的quit方法原始碼如下:
public void quit() {
mQueue.quit(false);
}
Looper的quitSafely方法原始碼如下:
public void quitSafely() {
mQueue.quit(true);
}
以上兩個方法中mQueue是MessageQueue型別的物件,二者都呼叫了MessageQueue中的quit方法,MessageQueue的quit方法原始碼如下:
void quit(boolean safe) {
if (!mQuitAllowed) {
throw new IllegalStateException("Main thread not allowed to quit.");
}
synchronized (this) {
if (mQuitting) {
return;
}
mQuitting = true;
if (safe) {
removeAllFutureMessagesLocked();
} else {
removeAllMessagesLocked();
}
// We can assume mPtr != 0 because mQuitting was previously false.
nativeWake(mPtr);
}
}
通過觀察以上原始碼我們可以發現:
當我們呼叫Looper的quit方法時,實際上執行了MessageQueue中的removeAllMessagesLocked方法,該方法的作用是把MessageQueue訊息池中所有的訊息全部清空,無論是延遲訊息(延遲訊息是指通過sendMessageDelayed或通過postDelayed等方法傳送的需要延遲執行的訊息)還是非延遲訊息。
當我們呼叫Looper的quitSafely方法時,實際上執行了MessageQueue中的removeAllFutureMessagesLocked方法,通過名字就可以看出,該方法只會清空MessageQueue訊息池中所有的延遲訊息,並將訊息池中所有的非延遲訊息派發出去讓Handler去處理,quitSafely相比於quit方法安全之處在於清空訊息之前會派發所有的非延遲訊息。
無論是呼叫了quit方法還是quitSafely方法只會,Looper就不再接收新的訊息。即在呼叫了Looper的quit或quitSafely方法之後,訊息迴圈就終結了,這時候再通過Handler呼叫sendMessage或post等方法傳送訊息時均返回false,表示訊息沒有成功放入訊息佇列MessageQueue中,因為訊息佇列已經退出了。
需要注意的是Looper的quit方法從API Level 1就存在了,但是Looper的quitSafely方法從API Level 18才新增進來。
相關文章
- Android中的Handler, Looper, MessageQueue和ThreadAndroidOOPthread
- android -- Looper.prepare()和Looper.loop() —深入版AndroidOOP
- Android view中的requestLayout和invalidate方法AndroidView
- android中activity全屏的方法Android
- Android-Looper類AndroidOOP
- Android 中 WebView 的除錯方法AndroidWebView除錯
- Android中的onWindowFocusChanged()方法詳解Android
- laravel中delete()方法和destroy()方法的區別Laraveldelete
- Android 訊息機制:Handler、MessageQueue 和 LooperAndroidOOP
- Android原始碼解析--LooperAndroid原始碼OOP
- 深入原始碼解析Android中的Handler,Message,MessageQueue,Looper原始碼AndroidOOP
- flutter中實現仿Android端的onResume和onPause方法FlutterAndroid
- 終止Android中HandlerThread的方法Androidthread
- Android中Cursor 的一些方法Android
- JS中的call()方法和apply()方法用法總結JSAPP
- Handler後傳篇一: 為什麼Looper中的Loop()方法不能導致主執行緒卡死?OOP執行緒
- Android自定義View之requestLayout方法和invalidate方法AndroidView
- Android 中Message,MessageQueue,Looper,Handler詳解+例項AndroidOOP
- Java中 equals() 方法和 == 的區別Java
- JS中的call()和apply()方法JSAPP
- android 中Service 和activity之間的資料傳遞的幾種方法Android
- Android Handler與Looper原理簡析AndroidOOP
- Android自定義View之invalidate方法和postInvalidate方法AndroidView
- 簡單的方法掌握JS中slice,splice和split的使用方法JS
- android 在程式碼中安裝apk的方法AndroidAPK
- activity和fragment中startactivityforresult方法的區別Fragment
- jQuery中css()和attr()方法的區別jQueryCSS
- 【轉】JS中的call()和apply()方法JSAPP
- python中模組和方法的查詢Python
- ppt中插入和處理影片的方法
- ROR中h()方法和sanitize的區別
- javascript(js)中的 substring和substr方法JavaScriptJS
- Activity 中的方法 findViewById(int) 和 AppCompatActivity 中的方法 findViewById(int) 都匹配...ViewAPP
- Android Handler Looper Message 詳細分析AndroidOOP
- H5 呼叫 Android 和 iOS 方法H5AndroidiOS
- Android ListView中獲取選中行資料的方法AndroidView
- css中:not()選擇器和jQuery中.not()方法CSSjQuery
- android 獲取螢幕高度和寬度的方法Android