Android 如何保證同一個(gè)線程Looper的唯一性

Android 程序員在面試的時(shí)候被問到頻率最高的就是Handler相關(guān)的問題泣棋,聊到Handler就離不開Looper。那么Android 是如何保證一個(gè)線程對(duì)應(yīng)一個(gè)Looper的呢畔塔。要想弄清楚這個(gè)問題潭辈,我們只能通過源碼找答案。

講這個(gè)問題之前我們先看看Looper是什么時(shí)候創(chuàng)建的澈吨。

Looper的創(chuàng)建

我們都知道Looper的重要性把敢,但是我們?cè)谑褂肏andler發(fā)送和處理消息的時(shí)候會(huì)new一個(gè)Handler,可是為什么沒有new Looper()呢谅辣。

在Activity的主線程中修赞,Looper是被默認(rèn)創(chuàng)建的,所以先來看下ActivityThread源碼桑阶。

圖一:ActivityThread main()源碼

也就是說在我們的主線程被創(chuàng)建的時(shí)候就把Looper()創(chuàng)建好了(6442行) 柏副。

小伙伴們可能有有疑問呢,為什么不是new而是prepare呢蚣录?看下圖大家就明白啦割择!

圖二:Looper 構(gòu)造方法

接下來咱們看看prepareMainLooper()干了什么

圖二:Looper prepareMainLooper()方法??

圖三:?Looper?prepare()方法

圖四:Looper?myLooper()方法

prepare()方法里面判斷了一下如果ThreadLocal get() 不等于空就拋出異常,否則就set一個(gè)Looper()萎河,因此prepare()在同一個(gè)線程里面是不能被調(diào)用兩次的荔泳。

重點(diǎn)來了!E氨玛歌!ThreadLocal 是什么?

我們來看下ThreadLocal都干了啥擎椰。

圖五:?ThreadLocal set()方法??

圖五:?ThreadLocal get()方法??

在set方法里面拿到了當(dāng)前的線程支子,然后獲取了一個(gè)ThreadLocalMap對(duì)象,將當(dāng)前線程作為key达舒,set方法里面的參數(shù)作為value 放到ThreadLoaclMap里面.值朋。

圖六:ThreadLocalMap

圖七:?ThreadLocalMap? set方法

這里set的時(shí)候判斷如果Map里面有的話就替換賦值。get的時(shí)候根據(jù)Thread去拿value(在Looper這就是拿到了Looper 對(duì)象)休弃⊥碳撸看到這里我們標(biāo)題的問題就迎刃而解了圈膏。

Looper在創(chuàng)建的時(shí)候如果有值會(huì)拋出異常塔猾,沒值的時(shí)候就去new,而當(dāng)我們拿Looper的時(shí)候通過當(dāng)前線程鍵值對(duì)去拿稽坤,保證了唯一性丈甸。

好啦糯俗,Looper唯一性就講到這里,小伙伴們聽懂了嗎睦擂?

博主第一次寫專業(yè)知識(shí)講解得湘,喜歡的點(diǎn)個(gè)贊加個(gè)關(guān)注,大家一起進(jìn)步顿仇。(有錯(cuò)誤歡迎指出)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淘正,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子臼闻,更是在濱河造成了極大的恐慌鸿吆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件述呐,死亡現(xiàn)場(chǎng)離奇詭異惩淳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乓搬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門思犁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人进肯,你說我怎么就攤上這事激蹲。” “怎么了坷澡?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵托呕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我频敛,道長(zhǎng)项郊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任斟赚,我火速辦了婚禮着降,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拗军。我一直安慰自己任洞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布发侵。 她就那樣靜靜地躺著交掏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刃鳄。 梳的紋絲不亂的頭發(fā)上盅弛,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼挪鹏。 笑死见秽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讨盒。 我是一名探鬼主播解取,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼返顺!你這毒婦竟也來了禀苦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤遂鹊,失蹤者是張志新(化名)和其女友劉穎伦忠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稿辙,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昆码,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邻储。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赋咽。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吨娜,靈堂內(nèi)的尸體忽然破棺而出脓匿,到底是詐尸還是另有隱情,我是刑警寧澤宦赠,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布陪毡,位于F島的核電站,受9級(jí)特大地震影響勾扭,放射性物質(zhì)發(fā)生泄漏毡琉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一妙色、第九天 我趴在偏房一處隱蔽的房頂上張望桅滋。 院中可真熱鬧,春花似錦身辨、人聲如沸丐谋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)号俐。三九已至,卻和暖如春定庵,著一層夾襖步出監(jiān)牢的瞬間吏饿,已是汗流浹背践美。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留找岖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓敛滋,卻偏偏與公主長(zhǎng)得像许布,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绎晃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361