Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中Looper的quit方法和quitSafely方法

Android中Looper的quit方法和quitSafely方法

編輯:關於Android編程

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才添加進來。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved