外观
主线程 Looper 一直循环 为什么不会一直占用 CPU?
标准回答
Looper 在没有可执行工作时会进入 nativePollOnce 等等待路径,底层通过 poll 或 epoll 等机制等待事件或超时,线程处于阻塞而非持续忙轮询。新消息、到期消息或输入等事件会让线程继续处理。消息循环持续存在并不等于 CPU 持续繁忙,真正影响响应的是某个任务执行过久、队列积压或唤醒异常。排查时我会结合线程状态,区分 Running、可运行但未被调度和阻塞等待。
延伸追问
主线程栈停在 nativePollOnce 常常表示当下空闲,单凭这一帧栈不能认定它就是 ANR 根因。
内容来源
- Android Framework 知识手册 · 原条目
5-5