即next()方法取出Message的逻辑,仅考虑取值逻辑,不讨论休眠、唤醒等逻辑
这里要分为两种情况讨论。
情况一 取普通消息
过程相当简单(假设消息的时间已经到了,所以不考虑休眠)
Message msg = mMessages;
mMessages = msg.next;
msg.next = null;
msg.markInUse();
return msg;
情况二 开启同步屏障,取异步消息
Message msg = mMessages;
// 同步屏障就是一个target为空的消息
if (msg != null && msg.target == null) {
do {
prevMsg = msg;
msg = msg.next;
// 这里普通消息会达到条件,因此进入循环,除非找到异步消息,或者轮询完整个队列,才能跳出循环
} while (msg != null && !msg.isAsynchronous());
}
if (msg != null) {
if (now < msg.when) {
...
} else {
mBlocked = false;
// 开启同步屏障prevMsg才会不为空
if (prevMsg != null) {
// 将异步消息剪出来
prevMsg.next = msg.next;
} else {
mMessages = msg.next;
}
msg.next = null;
msg.markInUse();
return msg;
}
}