Android Framework學(xué)習(xí)之主線程進(jìn)入loop循環(huán)為什么沒(méi)有ANR

應(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里寫(xiě)東西時(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è)寫(xiě)操作,這是主線程就會(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里),再寫(xiě)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ù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容