android - 什么是android中的消息队列本机轮询?

Saj*_*uzi 19 java profile cpu performance android

我知道线程有一个消息队列,处理程序能够将runnables或消息推送到它们,但是当我使用Android Studio工具分析我的android应用程序时,有一个奇怪的过程:

android.os.MessageQueue.nativePollOnce

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

在此输入图像描述

Law*_*usz 30

简短回答:

nativePollOnce方法用于"等待"直到下一个Message变得可用.如果在此调用期间花费的时间很长,则您的主(UI)线程无需执行任何实际工作,并等待下一个要处理的事件.没有必要担心这一点.

说明:

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

A Message被添加到队列中,例如响应输入事件,帧渲染回调甚至是您自己的Handler.post调用.有时主线程没有工作要做(也就是说,队列中没有消息),这可能发生在例如完成渲染单帧之后(线程刚刚绘制了一帧并准备好下一帧,只是等待一个恰当的时候).由于消息以不可预测的方式添加到队列中,因此该MessageQueue方法(在其中Message next()调用)会主动检查使用CPU周期的新消息.

结论:

你不应该担心boolean enqueueMessage(Message, long).它只表示已完成所有消息的处理,并且线程等待下一个消息.嗯,这只是意味着你不会给你的主线程太多的工作;)

  • 知道为什么我的 nativePollOnce 会收到 ANR 吗?/sf/ask/5003471371/ (10认同)
  • @Florian我刚刚更新了我的答案以提供更多详细信息(并纠正我原始答案中的一些不正确信息)。 (2认同)
  • @linjiejun 指示主线程执行渲染工作的消息可能来自框架(例如输入事件等)或应用程序本身(例如当您安排动画等时)。有关详细信息,请参阅 Choreographer 类描述 (https://developer.android.com/reference/android/view/Choreographer)。 (2认同)
  • @MarianPaździoch这是错误的,真正的ANR原因不是nativePollOnce (2认同)