應(yīng)用主線程進(jìn)入loop循環(huán)為什么沒(méi)有ANR?
ANR dialog 是 在 AMS里彈出來(lái)的刚陡,AMS在SystemServer進(jìn)程(系統(tǒng)進(jìn)程)啤斗,
mUiHandler:是SystemServer進(jìn)程里的焚鲜,它不是SystemServer的主線程曲尸,而是SystemServer的一個(gè)子線程,說(shuō)明刷新UI不一定要在主線程
InputDispatching Timeout比肄,指的就是在Activity界面的input(輸入快耿,點(diǎn)擊等操作) time out
Service ANR
scheduleServiceTimeoutLocked:?jiǎn)?dòng)超時(shí)機(jī)制
app.thread.scheduleCreateService: AMS通知應(yīng)用端創(chuàng)建service
應(yīng)用端處理AMS發(fā)過(guò)來(lái)的創(chuàng)建service的指令
ActivityManagerNative.getDefault().serviceDoneExecuting(...): 向AMS發(fā)起的binder調(diào)用
應(yīng)用主線程
nativePollOnce:可能會(huì)阻塞在epoll_wait里等待eventFd有可讀事件(當(dāng)另外一個(gè)線程向這個(gè)eventFd里寫東西時(shí),就有可讀事件)
哪些線程可能會(huì)往主線程發(fā)消息
主線程給自己發(fā)消息(主線程是running狀態(tài)芳绩,阻塞狀態(tài)不行)
應(yīng)用子線程給主線程發(fā)消息
binder線程給主線程發(fā)消息润努,系統(tǒng)服務(wù)向應(yīng)用端發(fā)起binder調(diào)用(跨進(jìn)程)時(shí),應(yīng)用端是在binder線程池里處理的示括,比如scheduleLaunchActivity铺浇,scheduleCreateService,scheduleReceiver都是運(yùn)行在binder線程池垛膝,應(yīng)用端將這些請(qǐng)求封裝成message 發(fā)到 主線程 去處理
當(dāng)主線程沒(méi)有消息時(shí)就會(huì)阻塞鳍侣,進(jìn)入休眠狀態(tài),線程B發(fā)送msg到主線程的messageQueue里的同時(shí)還往eventFd發(fā)起一個(gè)寫操作吼拥,這是主線程就會(huì)得到一個(gè)可讀事件倚聚,主線程從休眠狀態(tài)被喚醒,然后取消息凿可,分發(fā)消息惑折。
所以說(shuō),主線程休眠后必須要有別的線程將其喚醒
應(yīng)用主線程loop循環(huán)枯跑,為什么沒(méi)有ANR惨驶?
ANR是一樣沒(méi)有在規(guī)定的時(shí)間內(nèi)完成AMS指定的任務(wù)導(dǎo)致的
AMS請(qǐng)求調(diào)到應(yīng)用端binder線程(應(yīng)用端將請(qǐng)求封裝成msg發(fā)到主線程messageQueue里),再寫eventFd去喚醒主線程來(lái)處理敛助,如果應(yīng)用端處理這個(gè)binder請(qǐng)求很耗時(shí)就會(huì)導(dǎo)致ANR粗卜,或者當(dāng)前主線程中有耗時(shí)任務(wù)在執(zhí)行。
ANR不是因?yàn)橹骶€程loop循環(huán)纳击,而是因?yàn)橹骶€程中有耗時(shí)任務(wù)