Handler的主要作用是為了實(shí)現(xiàn)線程間通信
Handler的整個(gè)流程中,包含了四個(gè)對(duì)象:Handler魄眉、message笛粘、messageQueue、looper
當(dāng)應(yīng)用創(chuàng)建的時(shí)候郑兴,就會(huì)在主線程中創(chuàng)建handler對(duì)象
我們把要發(fā)送的信息保存到message中,handler通過sendMessage方法將message發(fā)送到messageQueue中贝乎,looper對(duì)象不斷的調(diào)用loop()方法不斷的從messageQueue中取出message情连,交由handler處理。從而實(shí)現(xiàn)線程間通信览效。
主線程looper.loop()為什么不阻塞主線程却舀?
造成ANR的原因一般有兩種:
1. 當(dāng)前的事件沒有機(jī)會(huì)得到處理(即主線程正在處理前一個(gè)事件,沒有及時(shí)的完成或者looper被某種原因阻塞住了)
2.當(dāng)前的事件正在處理锤灿,但沒有及時(shí)完成
應(yīng)用啟動(dòng)時(shí)挽拔,在ActivityThread的main方法中就創(chuàng)建了一個(gè)當(dāng)前主線程的looper(我們不需要手動(dòng)開啟looper),并開啟了消息隊(duì)列但校,消息隊(duì)列是一個(gè)無限循環(huán)螃诅,應(yīng)用的整個(gè)生命周期就是運(yùn)行在這個(gè)消息循環(huán)中的,安卓是由事件驅(qū)動(dòng)的,Looper.loop不斷的接收處理事件术裸,looper.loop一旦結(jié)束倘是,應(yīng)用程序的生命周期也就結(jié)束了,所以只能說事件的處理如果阻塞的話會(huì)導(dǎo)致ANR袭艺,而不能說looper的無限循環(huán)會(huì)導(dǎo)致ANR搀崭。
loop會(huì)不會(huì)對(duì)CPU性能有過多的消耗
在子線程創(chuàng)建Handler,此時(shí)由于這個(gè)線程中沒有默認(rèn)開啟的消息隊(duì)列,所以我們需要手動(dòng)調(diào)用looper.prepare(),并通過looper.loop開啟消息匹表。主線程Looper從消息隊(duì)列讀取消息门坷,當(dāng)讀完所有消息時(shí),主線程阻塞袍镀。子線程往消息隊(duì)列發(fā)送消息默蚌,并且往管道文件寫數(shù)據(jù),主線程即被喚醒苇羡,從管道文件讀取數(shù)據(jù)绸吸,主線程被喚醒只是為了讀取消息,當(dāng)消息讀取完畢设江,再次睡眠锦茁。因此loop的循環(huán)并不會(huì)對(duì)CPU性能有過多的消耗。