Handler享幽,Message,looper 和 MessageQueue 構(gòu)成了安卓的消息機(jī)制拾弃,handler創(chuàng)建后可以通過(guò) sendMessage 將消息加入消息隊(duì)列琉闪,然后 looper不斷的將消息從 MessageQueue 中取出來(lái),回調(diào)到 Hander 的 handleMessage方法砸彬,從而實(shí)現(xiàn)線(xiàn)程的通信颠毙。
從兩種情況來(lái)說(shuō),第一在UI線(xiàn)程創(chuàng)建Handler,此時(shí)我們不需要手動(dòng)開(kāi)啟looper砂碉,因?yàn)樵趹?yīng)用啟動(dòng)時(shí)蛀蜜,在ActivityThread的main方法中就創(chuàng)建了一個(gè)當(dāng)前主線(xiàn)程的looper,并開(kāi)啟了消息隊(duì)列增蹭,消息隊(duì)列是一個(gè)無(wú)限循環(huán)滴某,為什么無(wú)限循環(huán)不會(huì)ANR?因?yàn)榭梢哉f(shuō),應(yīng)用的整個(gè)生命周期就是運(yùn)行在這個(gè)消息循環(huán)中的滋迈,安卓是由事件驅(qū)動(dòng)的霎奢,Looper.loop不斷的接收處理事件,每一個(gè)點(diǎn)擊觸摸或者Activity每一個(gè)生命周期都是在Looper.loop的控制之下的饼灿,looper.loop一旦結(jié)束幕侠,應(yīng)用程序的生命周期也就結(jié)束了。我們可以想想什么情況下會(huì)發(fā)生ANR碍彭,第一晤硕,事件沒(méi)有得到處理,第二庇忌,事件正在處理舞箍,但是沒(méi)有及時(shí)完成,而對(duì)事件進(jìn)行處理的就是looper皆疹,所以只能說(shuō)事件的處理如果阻塞會(huì)導(dǎo)致ANR疏橄,而不能說(shuō)looper的無(wú)限循環(huán)會(huì)ANR
另一種情況就是在子線(xiàn)程創(chuàng)建Handler,此時(shí)由于這個(gè)線(xiàn)程中沒(méi)有默認(rèn)開(kāi)啟的消息隊(duì)列,所以我們需要手動(dòng)調(diào)用looper.prepare(),并通過(guò)looper.loop開(kāi)啟消息
主線(xiàn)程Looper從消息隊(duì)列讀取消息略就,當(dāng)讀完所有消息時(shí)捎迫,主線(xiàn)程阻塞晃酒。子線(xiàn)程往消息隊(duì)列發(fā)送消息,并且往管道文件寫(xiě)數(shù)據(jù)立砸,主線(xiàn)程即被喚醒掖疮,從管道文件讀取數(shù)據(jù)初茶,主線(xiàn)程被喚醒只是為了讀取消息颗祝,當(dāng)消息讀取完畢,再次睡眠恼布。因此loop的循環(huán)并不會(huì)對(duì)CPU性能有過(guò)多的消耗螺戳。