每日一題:Looper無限循環(huán)的阻塞為啥沒有ANR


theme: awesome-green

在android面試中白魂,我們常會遇到Framework面試相關(guān)問題槽片,而今天要分享的就是Looper無限循環(huán)的阻塞為啥沒有ANR何缓?

其主要考察的是程序員是否了解Looper的運行機制。

一般遇到此類問題我們可以從以下兩個方面去回答:

  1. Handler的內(nèi)部原理
  2. ANR發(fā)生的原因

問題正解:

1.首先回答ANR是什么筐乳?引起ANR的主要原因有哪些歌殃?
  • ANR(Application Not Responding)是應用無響應乔妈。ndroid系統(tǒng)對于一些事件需要在一定的時間范圍內(nèi)完成,如果超過預定時間能未能得到有效響應或者響應時間過長勃刨,都會造成ANR。

  • 發(fā)生ANR的主要四種情況:

    1)Service Timeout:前臺服務在20s內(nèi)未執(zhí)行完成身隐; 2)BroadcastQueue Timeout:前臺廣播在10s內(nèi)未執(zhí)行完成 3)ContentProvider Timeout:內(nèi)容提供者在publish過超時10s; 4)InputDispatching Timeout:輸入事件分發(fā)超時5s唯灵,包括按鍵和觸摸事件贾铝。

    對于Service埠帕、Broadcast、Provider組件類的ANR而言敛瓷,如果把發(fā)生ANR比作是引爆炸彈,那么整個流程包含三部分組成:

    埋炸彈:中控系統(tǒng)(system_server進程)啟動倒計時埋下定時器呐籽,在規(guī)定時間內(nèi)如果目標(Servcie、Broadcast庶橱、Provider)沒有干完所有的活,則中控系統(tǒng)會定向炸毀(殺進程)目標苏章,就相當于埋下一個定時炸彈馍乙。 拆炸彈:在規(guī)定的時間內(nèi)干完工地的所有活,并及時向中控系統(tǒng)報告完成丝格,請求解除定時炸彈,則幸免于難显蝌。 引爆炸彈:中控系統(tǒng)立即封裝現(xiàn)場订咸,抓取快照酬诀,搜集目標執(zhí)行慢的罪證(traces)脏嚷,便于后續(xù)調(diào)試分析,最后是炸毀目標父叙。

    對于輸入超時肴裙,與其他3個組件類ANR是不同的趾唱,Input類型的超時機制并非時間到了一定就會爆炸蜻懦,而是處理后續(xù)上報事件的過程才會去檢測是否該爆炸,所以更像是掃雷過程悠咱。具體的邏輯是這樣的:對于輸入系統(tǒng)而言征炼,即使某次事件執(zhí)行時間超過預期的時長析既,只要用戶后續(xù)沒有再生成輸入事件柒室,那么也不需要ANR。而只有當新一輪的輸入事件到來雄右,此時正在分發(fā)事件的窗口(即App應用本身)遲遲無法釋放資源給新的事件去分發(fā),這時InputDispatcher才會根據(jù)超時時間囤屹,動態(tài)的判斷是否需要向?qū)拇翱谔崾続NR信息逢渔。

    那么明白了ANR的原因后,我們再來看一下Looper的阻塞原理肃廓。

2.Looper無限循環(huán)如何導致阻塞的
  • Looper無限循環(huán)是Looper不停取MessageQueen中的Message并執(zhí)行這個message的一種機制。我們的APP中的事件盲赊,如Activity的生命周期切換、點擊诚卸、長按、滑動合溺、都是依賴這種機制。
  • 如果主線程的MessageQueue中沒有消息哮奇,便會阻塞在Loop的queue.next()中的nativePollOnce方法恭朗。這個時候主線程會進入休眠狀態(tài)并釋放CPU資源依疼,如果下一個消息到達或者有事物發(fā)生,通過向pipe管道寫入數(shù)據(jù)來進行喚醒主線程工作律罢。
3.Looper無限循環(huán)為啥沒有ANR?
  • Looper循環(huán)的阻塞是在消息隊列無消息需要處理時的一種機制,這種機制就是讓CPU停下來去做別的事误辑。而且消息隊列無消息沧踏,那么就是需要需要讓cpu停下來巾钉,避免cpu空轉(zhuǎn),這個機制和ANR是沒有關(guān)系的砰苍,完全不是同一個事,所以自然不會導致ANR

今日分享到此結(jié)束茬缩,下期更精彩~

關(guān)注博主個人簡介吼旧,面試不迷路

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市圈暗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勇哗,老刑警劉巖昵济,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野揪,死亡現(xiàn)場離奇詭異瞧栗,居然都是意外死亡斯稳,警方通過查閱死者的電腦和手機迹恐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門殴边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憎茂,“玉大人锤岸,你說我怎么就攤上這事∪猓” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵馋评,是天一觀的道長刺啦。 經(jīng)常有香客問我,道長玛瘸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任市咆,我火速辦了婚禮再来,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芒篷。我一直安慰自己,他們只是感情好针炉,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布篡帕。 她就那樣靜靜地躺著贸呢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楞陷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天固蛾,我揣著相機與錄音度陆,去河邊找鬼。 笑死懂傀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沧竟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闪水!你這毒婦竟也來了蒙具?” 一聲冷哼從身側(cè)響起球榆,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤禁筏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后每强,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡空执,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年辨绊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门坷。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖默蚌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敏簿,我是刑警寧澤明也,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布惯裕,位于F島的核電站,受9級特大地震影響撑刺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜够傍,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一挠铲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拂苹,春花似錦、人聲如沸瓢棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽连霉。三九已至,卻和暖如春窘面,著一層夾襖步出監(jiān)牢的瞬間财边,已是汗流浹背肌括。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工谍夭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留黑滴,地道東北人紧索。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像晚缩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荞彼,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容