Android中Looper的quit方法和quitSafely方法

653 阅读1分钟

那如何终止消息循环呢?

我们可以调用Looper的quit方法或quitSafely方法,二者稍有不同。

Looper的quit方法源码如下:

public void quit() {    mQueue.quit(false);}

Looper的quitSafely方法源码如下:

public void quitSafely() {
    mQueue.quit(true);
}


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

通过观察以上源码我们可以发现:

1.当我们调用Looper的quit方法时

实际上执行了MessageQueue中的removeAllMessagesLocked方法,该方法的作用是把MessageQueue消息池中所有的消息全部清空,无论是延迟消息(延迟消息是指通过sendMessageDelayed或通过postDelayed等方法发送的需要延迟执行的消息)还是非延迟消息。

2.当我们调用Looper的quitSafely方法时,

实际上执行了MessageQueue中的removeAllFutureMessagesLocked方法,通过名字就可以看出,该方法只会清空MessageQueue消息池中所有的延迟消息,并将消息池中所有的非延迟消息派发出去让Handler去处理,quitSafely相比于quit方法安全之处在于清空消息之前会派发所有的非延迟消息。

3.无论是调用了quit方法还是quitSafely方法只会,Looper就不再接收新的消息。

需要注意的是Looper的quit方法从API Level 1就存在了,但是Looper的quitSafely方法从API Level 18才添加进来。