是否存在messageQueue存在异步消息但线程仍被阻塞的情况?

时间:2019-06-02 09:41:08

标签: android handler

问题:

if (needWake && p.isAsynchronous())

  • 哪个场景会触发此条件?

  • 为什么在返回true时无需唤醒线程?

Android MessageQueue

boolean enqueueMessage(Message msg, long when) {

        // ... Omit part of the code

        synchronized (this) {

            // ... Omit part of the code

            Message p = mMessages;
            boolean needWake;
            if (p == null || when == 0 || when < p.when) {
                msg.next = p;
                mMessages = msg;
                needWake = mBlocked;
            } else {
                needWake = mBlocked && p.target == null && msg.isAsynchronous();
                Message prev;
                for (;;) {
                    prev = p;
                    p = p.next;
                    if (p == null || when < p.when) {
                        break;
                    }

                    if (needWake && p.isAsynchronous()) {
                        needWake = false;
                    }
                }
                msg.next = p;
                prev.next = msg;
            }

            if (needWake) {
                nativeWake(mPtr);
            }
        }
        return true;
    }

0 个答案:

没有答案