如果在Android中判斷某個(gè)線(xiàn)程是否是主線(xiàn)程?對(duì)于這個(gè)問(wèn)題,你可能說(shuō)根據(jù)線(xiàn)程的名字,當(dāng)然這個(gè)可以解決問(wèn)題,但是這樣是可靠的么?萬(wàn)一某天Google一下子將線(xiàn)程的名字改稱(chēng)其他神馬東西呢。
下面的方法是可靠的解決方案。
1 2 3 |
|
實(shí)際上,寫(xiě)到這里就基本解決了文章標(biāo)題的問(wèn)題了,但是僅僅研究到這里太膚淺了,刨的不夠深,所以需要繼續(xù),希望你也可以繼續(xù)讀下去。
好,現(xiàn)在,我們對(duì)這個(gè)穩(wěn)定的方法做一些測(cè)試,首先,下面的方法會(huì)增加一些調(diào)試打印信息。
1 2 3 4 5 6 7 |
|
好,然后我們?cè)谥骶€(xiàn)程中運(yùn)行一個(gè)測(cè)試,調(diào)用上述方法。比如我們這樣調(diào)用。
1
|
|
OK,我們看一下輸出日志。驗(yàn)證OK。
1 2 |
|
現(xiàn)在我們繼續(xù)在一個(gè)沒(méi)有消息循環(huán)的非主線(xiàn)程,進(jìn)行驗(yàn)證。
1 2 3 4 5 6 7 8 |
|
正如我們看到的如下日志結(jié)果,主線(xiàn)程的Looper(翻譯成循環(huán)泵,不是很好聽(tīng))已經(jīng)被初始化賦值。但是我們新創(chuàng)建的線(xiàn)程的looper還是null。這是因?yàn)?strong style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size:18.4px;vertical-align:baseline;">Android中的線(xiàn)程默認(rèn)沒(méi)有一個(gè)和它綁定了的消息循環(huán)(Threads by default do not have a message loop associated with them. Of course, the method works)
1 2 |
|
繼續(xù),我們創(chuàng)建一個(gè)綁定了消息循環(huán)的線(xiàn)程,根據(jù)Android開(kāi)發(fā)者文檔說(shuō)明,以下是一個(gè)典型的創(chuàng)建消息循環(huán)線(xiàn)程的示例,使用單獨(dú)prepare()方法和loop()方法來(lái)創(chuàng)建一個(gè)綁定到Looper的Handler。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
OK,現(xiàn)在再次檢查以下日志,
1 2 |
|
兩個(gè)Looper都被初始化賦值了,但是他們是不同的對(duì)象。
但是,這是為什么呢,這里面有什么奧秘呢? 好,讓我們看以下Looper.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
對(duì)于主線(xiàn)程來(lái)說(shuō),prepareMainLooper這個(gè)方法會(huì)被Android運(yùn)行環(huán)境調(diào)用,而不是程序顯式調(diào)用。通過(guò)這個(gè)方法,主線(xiàn)程的looper被創(chuàng)建,并且將對(duì)象引用傳遞給sMainLooper。所以保證了主線(xiàn)程myLooper()獲取到的引用和getMainLooper()獲取到的都是同一個(gè)引用。
對(duì)于沒(méi)有消息循環(huán)的非主線(xiàn)程,默認(rèn)的當(dāng)前線(xiàn)程的looper是null,因?yàn)槟銖膩?lái)沒(méi)有手動(dòng)地調(diào)用prepare(),所以它和主線(xiàn)程的looper不一樣。
對(duì)于綁定了消息循環(huán)的非主線(xiàn)程,當(dāng)調(diào)用Looper.prepare方法時(shí),主線(xiàn)程的Looper已經(jīng)由Android運(yùn)行環(huán)境創(chuàng)建,當(dāng)調(diào)用prepare方法后,綁定到這個(gè)非主線(xiàn)程的looper被創(chuàng)建,當(dāng)然,這不可能和主線(xiàn)程的Looper一樣。
綜上所述,這個(gè)方法是可靠的。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來(lái)源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。