Handler原理解析

首先從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)程官套。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酒奶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奶赔,更是在濱河造成了極大的恐慌惋嚎,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件站刑,死亡現(xiàn)場(chǎng)離奇詭異另伍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绞旅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)摆尝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)愕宋,“玉大人,你說(shuō)我怎么就攤上這事结榄≈斜矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵臼朗,是天一觀(guān)的道長(zhǎng)邻寿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)视哑,這世上最難降的妖魔是什么绣否? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮挡毅,結(jié)果婚禮上蒜撮,老公的妹妹穿的比我還像新娘。我一直安慰自己跪呈,他們只是感情好段磨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著耗绿,像睡著了一般苹支。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上误阻,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天债蜜,我揣著相機(jī)與錄音,去河邊找鬼究反。 笑死寻定,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的精耐。 我是一名探鬼主播狼速,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黍氮!你這毒婦竟也來(lái)了唐含?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沫浆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后滚秩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體专执,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年郁油,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了本股。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攀痊。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拄显,靈堂內(nèi)的尸體忽然破棺而出苟径,到底是詐尸還是另有隱情,我是刑警寧澤躬审,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布棘街,位于F島的核電站,受9級(jí)特大地震影響承边,放射性物質(zhì)發(fā)生泄漏遭殉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一博助、第九天 我趴在偏房一處隱蔽的房頂上張望险污。 院中可真熱鬧,春花似錦富岳、人聲如沸蛔糯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渤闷。三九已至,卻和暖如春脖镀,著一層夾襖步出監(jiān)牢的瞬間飒箭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蜒灰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弦蹂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓强窖,卻偏偏與公主長(zhǎng)得像凸椿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翅溺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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