主线程的Looper为什么不会导致应用ANR

ANR类型

  • Service timeout:
    • 前台服务 20s
    • 后台服务 200s
  • BroadcastQueue timeout:
    • 前台广播10s
    • 后台广播60s
  • ContentProvider timeout:10s
  • InputDispatching timeout:5s

1
2
3
4
5
6
7
8
9
10
void scheduleServiceTimeoutLocked(ProcessRecord proc) {
if (proc.executingServices.size() == 0 || proc.thread == null) {
return;
}
Message msg = mAm.mHandler.obtainMessage(
ActivityManagerService.SERVICE_TIMEOUT_MSG);
msg.obj = proc;
mAm.mHandler.sendMessageDelayed(msg,
proc.execServicesFg ? SERVICE_TIMEOUT : SERVICE_BACKGROUND_TIMEOUT);
}

SERVICE_TIMEOUT时间后会执行这个msg,导致ANR。

主线程究竟在干什么

ActivityThread.main()中:Looper.loop();

一直在死循环!!!

ANR只是针对某些情况没有及时响应抛出的异常。这种异常是通过handler发送的消息抛出的。

looper handler messageQueue是整个线程运作的维持。

ANR是针对组件长时间未响应而抛出的异常。

两者不是统一层次的。

Looper为什么不会导致CPU占用率高

虽然Looper.loop()是一个死循环,但是在循环中会通过messageQueue.next()方法获取message,此时,如何消息队列为空,那么整个线程会进入阻塞状态,不会消耗cpu时间片。