外观
Looper 的循环为什么不会把 CPU 跑满?
标准回答
消息循环不是无休止执行空转代码。没有可执行消息时,底层会等待消息或相关事件,线程进入等待状态;新任务到来或等待时间到期后再被唤醒。真正的卡顿往往是某次任务执行太久,后续输入和绘制任务排队。
机制解释
判断主线程时要区分 Running、Runnable 与等待状态。Running 表示正在使用 CPU;Runnable 表示想运行但还没得到 CPU;等待可能是消息队列正常空闲,也可能是等锁、Binder 或 I/O。它们需要不同优化手段。
延伸追问
堆栈显示 nativePollOnce 就说明问题在那里吗?不一定,采样时主线程可能已经空闲。需结合问题发生时间和完整 Trace,避免把采样位置当作根因。
内容来源
- Android 智能硬件 SDK 技术 Wiki · 原条目
Q18