在Handler機制中叁征,每一個線程有一個Looper,Looper.loop()一直無限循環(huán)逛薇,為什么沒有造成ANR呢捺疼?
首先得知道造成ANR的根本原因是:
1.在5秒內(nèi)沒有響應輸入的事件(例如,按鍵按下永罚,屏幕觸摸)
2.BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢
造成以上兩點的原因有很多啤呼,比如在主線程中做了非常耗時的操作卧秘,比如說是下載,io異常等官扣。
再看Android主線程:
Java程序我們都知道翅敌,入口從main()方法執(zhí)行,安卓用java惕蹄,也不例外蚯涮,入口從ActivityThread的main();
在main()里執(zhí)行Looper.loop(),如果Looper不死循環(huán)卖陵,主線程執(zhí)行完遭顶,就結(jié)束了,那APP還有存在意義嗎赶促?
造成ANR的不是主線程阻塞液肌,而是主線程的Looper消息處理過程發(fā)生了任務(wù)阻塞,無法響應手勢操作鸥滨,不能及時刷新UI嗦哆。
主線程每隔16ms發(fā)送一個消息,用于刷新重繪UI婿滓,如果這個消息沒有及時的消費老速,那么頁面就會有卡頓感,嚴重的就是Application Not Resposing凸主。