ANR类型
- Service timeout:
- 前台服务 20s
- 后台服务 200s
- BroadcastQueue timeout:
- 前台广播10s
- 后台广播60s
- ContentProvider timeout:10s
- InputDispatching timeout:5s
1 | void scheduleServiceTimeoutLocked(ProcessRecord proc) { |
SERVICE_TIMEOUT时间后会执行这个msg,导致ANR。
主线程究竟在干什么
ActivityThread.main()中:Looper.loop();
一直在死循环!!!
ANR只是针对某些情况没有及时响应抛出的异常。这种异常是通过handler发送的消息抛出的。
looper handler messageQueue是整个线程运作的维持。
ANR是针对组件长时间未响应而抛出的异常。
两者不是统一层次的。
Looper为什么不会导致CPU占用率高
虽然Looper.loop()是一个死循环,但是在循环中会通过messageQueue.next()方法获取message,此时,如何消息队列为空,那么整个线程会进入阻塞状态,不会消耗cpu时间片。