synchronized (this) {
Message prev = null;
Message p = mMessages;
while (p != null && (p.target != null || p.arg1 != token)) {
prev = p;
p = p.next;
}
//从队列中删除这个消息屏障…
if (needWake && !mQuitting) {
nativeWake(mPtr);
}
}
}
-
根据无 target 及 token 匹配找到对应的消息屏障
-
删除屏障后可能需要唤醒线程,是否唤醒取决于当前是否是因为消息屏障而阻塞的
3. 如何插入一个异步消息?
Message 的 setAsynchronous 为开放 API,直接调用设置即可,比如在 ViewRootImpl 中对输入事件的处理:
public void dispatchInputEvent(InputEvent event, InputEventReceiver receiver) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = event;
args.arg2 = receiver;
Message msg = mHandler.obtainMessage(MSG_DISPATCH_INPUT_EVENT, args);
msg.setAsynch