首页 > 解决方案 > 当线程没有阻塞时,为什么还要调用 nativeWake()?

问题描述

nativeWake()为什么当线程没有阻塞时仍然调用?

当一个线程调用enqueueMessage()方法时,说明线程没有阻塞,但是为什么还要调用nativeWake()呢?

MessageQueue#enqueueMessage

boolean enqueueMessage(Message msg, long when) {

       ……
            if (needWake) {
                nativeWake(mPtr);
           }
     }

标签: androidandroid-handlerandroid-looper

解决方案


当所有消息都在等待时,您调用 enqueue 其中一个,它只是检查头部,以防在顶部安装了一些重要的东西。

        //Log.d("MessageQueue", "Enqueing: " + msg);
        Message p = mMessages;
        if (p == null || when == 0 || when < p.when) {
            msg.next = p;
            mMessages = msg;
            needWake = mBlocked; // new head, might need to wake up
        } else {
            Message prev = null;
            while (p != null && p.when <= when) {
                prev = p;
                p = p.next;
            }
            msg.next = prev.next;
            prev.next = msg;
            needWake = false; // still waiting on head, no need to wake up
        }
    }
    if (needWake) {
        nativeWake(mPtr);
    }

所以你只是跳过了重要的部分。


推荐阅读