该文章属于Android Handler系列文章,如果想了解更多,请点击
《Android Handler机制之总目录》
前言
在上几篇文中我们介绍了整个消息的循环机制以及消息的回收。现在我们来看看整么退出循环消息队列。(到现在为止,整个Android Handler机制快要接近尾声了。不知道大家看了整个系列的文章,有没有对Handler机制有个深一点的了解。如果对你有所帮助,我也感到十分的开心与自豪~~~)。
消息队列的退出
要想结束循环消息队列,需要调用Loooper的quitSafely()或quit()方法,具体代码如下所示:
public void quitSafely() { mQueue.quit(true);}
public void quit() { mQueue.quit(false); }
而该两个方法的内部,都会调用Loooper中对应的MessageQueue的quit(boolean safe)方法。查看quit(boolean safe)方法:
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();
}
nativeWake(mPtr);
}
}
在MessageQueue的quit(boolean safe)方法中,会将mQuitting (用于判断当前消息队列是否已经退出,该标志位十分有用,下文会提到)置为true,同时会根据当前是否安全退出的标志 (safe)来走不同的逻辑,如果安全则走removeAllFutureMessagesLocked()方法,如果不是安全退出则走removeAllMessagesLocked()方法。下面分别对这两个方法进行讨论。
非安全退出 removeAllMessagesLocked()方法
pr