gpt4 book ai didi

java - android - 什么是消息队列原生轮询在 android 中一次?

转载 作者:IT王子 更新时间:2023-10-28 23:36:56 27 4
gpt4 key购买 nike

我知道线程有一个消息队列,并且处理程序能够向它们推送可运行对象或消息,但是当我使用 Android Studio 工具分析我的 android 应用程序时,有一个奇怪的过程:

android.os.MessageQueue.nativePollOnce

它比所有其他进程使用 CPU 更多。它是什么以及如何减少 CPU 花费在它上面的时间?您可以在下面找到分析器结果。

enter image description here

最佳答案

简答:

nativePollOnce 方法用于“等待”直到下一个 Message 可用。如果在此调用期间花费的时间很长,则您的主 (UI) 线程没有实际工作要做,而是等待下一个事件处理。无需担心。

说明:

因为“主”线程负责绘制 UI 和处理各种事件,它的 Runnable 有一个处理所有这些事件的循环。循环由 Looper 管理。它的工作非常简单:它处理MessageQueue 中的所有消息。 .

一个 Message被添加到队列中,例如响应输入事件,作为帧渲染回调甚至你自己的 Handler.post 调用。有时主线程没有工作要做(即队列中没有消息),这可能会发生,例如在完成单帧渲染之后(线程刚刚绘制了一帧并准备好下一帧,只需等待适当的时间)。 MessageQueue 类中的两个 Java 方法对我们来说很有趣:Message next()boolean enqueueMessage(Message, long)Message next(),顾名思义,从队列中获取并返回下一条消息。如果队列为空(并且没有任何内容可返回),则该方法调用 native void nativePollOnce(long, int) 阻塞直到添加新消息。此时您可能会问 nativePollOnce 是如何知道何时唤醒的。这是一个非常好的问题。当Message加入队列时,框架调用enqueueMessage方法,不仅将消息插入队列,还调用native static void nativeWake (long),如果需要唤醒队列。 nativePollOncenativeWake 的核心魔法发生在 native (actually, C++) code . native MessageQueue 使用名为 epoll 的 Linux 系统调用,它允许监视 IO 事件的文件描述符。 nativePollOnce 在某个文件描述符上调用 epoll_wait,而 nativeWake 写入描述符,这是 IO 操作之一,epoll_wait 等待。然后内核从等待状态中取出epoll-waiting线程,线程继续处理新消息。如果你熟悉 Java 的 Object.wait()Object.notify() 方法,你可以想象 nativePollOnce 是一个粗略的等价物对于 Object.wait()nativeWake 对于 Object.notify(),但它们的实现方式完全不同:nativePollOnce 使用 epollObject.wait() 使用 futex Linux 调用。值得注意的是,nativePollOnceObject.wait() 都不会浪费 CPU 周期,因为当线程进入任一方法时,出于线程调度目的,它会被禁用(引用 javadoc Object 类)。但是,一些分析器可能会错误地将 epoll 等待(甚至对象等待)的线程识别为正在运行并消耗 CPU 时间,这是不正确的。如果这些方法实际上浪费了 CPU 周期,那么所有空闲的应用程序都将使用 100% 的 CPU,从而使设备发热并减慢速度。

结论:

您不必担心 nativePollOnce。它只是表示所有消息的处理已经完成,线程等待下一个。好吧,这仅仅意味着你不会给你的主线程做太多的工作;)

关于java - android - 什么是消息队列原生轮询在 android 中一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38818642/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com