首先從Handler 的構(gòu)造方法開(kāi)始呼畸,Handler有幾種構(gòu)造方法,先從最開(kāi)始的最普通的開(kāi)始颁虐,Handelr handler = new handler();
點(diǎn)進(jìn)去 看源碼:
publicHandler() {
? ? this(null,false);
}
進(jìn)去后回發(fā)現(xiàn)其中調(diào)用了
mLooper= Looper.myLooper();
mQueue=mLooper.mQueue;
即會(huì)添加該線(xiàn)程上對(duì)應(yīng)的一個(gè)Looper對(duì)象蛮原,然后拿到該線(xiàn)程對(duì)應(yīng)的MessageQueue,將創(chuàng)建的handler與該Looper綁定成對(duì)應(yīng)關(guān)系另绩,其中Looper是通過(guò)ThreadLocal(java的一個(gè)類(lèi)儒陨,可以通過(guò)它得到一個(gè)線(xiàn)程與相應(yīng)變量的Map,即通過(guò)它實(shí)現(xiàn)了Looper線(xiàn)程的唯一性)實(shí)現(xiàn)與每個(gè)線(xiàn)程做綁定一一對(duì)應(yīng)的笋籽,即每個(gè)線(xiàn)程可通過(guò)ThreadLocal拿到其對(duì)應(yīng)的那個(gè)Looper(前提是有)蹦漠,即一個(gè)線(xiàn)程最多對(duì)應(yīng)一個(gè)Looper,而每個(gè)Looper又管理一個(gè)消息隊(duì)列(MessageQueue)车海,而Handler即負(fù)責(zé)把消息傳給隊(duì)列的笛园,消息為Message,是谷歌封裝的一個(gè)消息類(lèi)容劳,里面可以傳普通的東西喘沿,也有callBack闸度,你想讓handlerMesage的執(zhí)行在哪個(gè)線(xiàn)程竭贩,就要把消息扔到對(duì)應(yīng)線(xiàn)程的MessageQueue里,而最開(kāi)始構(gòu)造方法里就是會(huì)有對(duì)handler里設(shè)置其對(duì)應(yīng)的MessageQueue莺禁,即創(chuàng)建它的線(xiàn)程上執(zhí)行留量。其中也有其他的構(gòu)造方法,可以把其他線(xiàn)程對(duì)應(yīng)的Looper設(shè)進(jìn)去哟冬,實(shí)現(xiàn)在另一線(xiàn)程上運(yùn)行楼熄。那么為什么塞到對(duì)應(yīng)的MessageQueue里就可以在對(duì)應(yīng)線(xiàn)程上執(zhí)行了呢?因?yàn)長(zhǎng)ooper所謂對(duì)應(yīng)一個(gè)線(xiàn)程浩峡,是指Looper在創(chuàng)建時(shí)會(huì)立刻執(zhí)行l(wèi)oop方法可岂,即loop方法是在其對(duì)應(yīng)的那個(gè)線(xiàn)程上執(zhí)行的,loop方法邏輯理解上比較單純翰灾,即是一個(gè)死循環(huán)不停地從MessageQueue里拿數(shù)據(jù)缕粹,一旦有Message來(lái)了稚茅,就會(huì)在該線(xiàn)程執(zhí)行里面的之前post進(jìn)來(lái)的Runnable,或者對(duì)Message執(zhí)行對(duì)應(yīng)HandleMessage平斩,即handler只是在子線(xiàn)程把消息放進(jìn)消息隊(duì)列里亚享,然后系統(tǒng)時(shí)間片輪轉(zhuǎn)時(shí)切換線(xiàn)程,繼續(xù)死循環(huán)遍歷MessageQueue绘面,一旦來(lái)了就執(zhí)行欺税,即最后執(zhí)行是在loop的線(xiàn)程上,即Looper創(chuàng)建的那個(gè)揭璃,即其對(duì)應(yīng)的那個(gè)線(xiàn)程晚凿。
Handler把消息扔進(jìn)消息隊(duì)列,message會(huì)存有該Handler的引用瘦馍,這樣在從消息隊(duì)列抽出來(lái)時(shí)晃虫,消息會(huì)被其對(duì)應(yīng)的Handler執(zhí)行。
最后一個(gè)扣墩,即為什么loop這個(gè)死循環(huán)會(huì)在主線(xiàn)程執(zhí)行哲银,不會(huì)ANR么?答呻惕,最開(kāi)始Android的入口A(yíng)ctivityThread里面的main方法荆责,里面有一個(gè)巨大的Handler,然后會(huì)創(chuàng)建一個(gè)主線(xiàn)程的looper對(duì)象亚脆,這也是為什么直接在主線(xiàn)程拿Handler就有Looper的原因做院,在其他線(xiàn)程是要自己Looper.prepare()的。其實(shí)整個(gè)Android就是在一個(gè)Looper的loop循環(huán)的濒持,整個(gè)Androidi的一切都是以Handler機(jī)制進(jìn)行的键耕,即只要有代碼執(zhí)行都是通過(guò)Handler來(lái)執(zhí)行的,而所謂ANR便是???Looper.loop沒(méi)有得到及時(shí)處理柑营,一旦沒(méi)有消息屈雄,Linux的epoll機(jī)制則會(huì)通過(guò)管道寫(xiě)文件描述符的方式來(lái)對(duì)主線(xiàn)程進(jìn)行喚醒與沉睡,android里調(diào)用了linux層的代碼實(shí)現(xiàn)在適當(dāng)時(shí)會(huì)睡眠主線(xiàn)程官套。