ANR的触发原理
ANR:App not responding
mUiHandler是systemService的handler,但是不在主线程,而是在子线程(刷新ui不一定需要在主线程)
触发ANR的场景:
-
Service timeout
-
BroadcastQueue timeout
-
ContentProvider timeout
-
InputDispatching timeout(输入事件无响应)
应用的大致启动流程
应用主线程的消息循环:
哪些线程可能会给主线程发送消息?
- 主线程给主线程发送消息
- 子线程给主线程发送消息
- binder线程给主线程发送消息
线程的消息循环机制
应用和系统服务通信的过程
总结
ANR是发生在应用没有在规定的时间内完成AMS指定的任务导致的。
AMS请求到应用端binder线程,再丢消息去唤醒主线程来处理。
ANR不是因为主线程loop()循环,而是因为主线程中有耗时任务未在规定时间内完成