Hanlder的存在主要是為了主線(UI)線程和子線程之間的通信(即Android的消息機制),原因是android中的主線程是不該執(zhí)行耗時操作的,容易產(chǎn)生ANR,所以耗時操作就必須放到子線程,而子線程又不能更新UI。
首先,一般情況下,是子線程向主線程發(fā)送消息,通知主線程更新UI。
更新消息的過程其實就是,在主線程中new一個handler實例出來,復(fù)寫handlerMessage()這個方法,當(dāng)在子線程中調(diào)用handler.sendmessage()這個方法的時候,主線程的handlermessage方法就會被調(diào)用。這樣的看似不涉及其他任何東西的類中,其實還涉及了MessageQueue以及Looper。messagequeue主要負(fù)責(zé),存放發(fā)過來的消息,而looper顧名思義,就是用來循環(huán)消息列隊的,一旦消息列隊中有消息,那么消息就會被取出來交給handler。
那么messagequeue是怎么產(chǎn)生的呢?當(dāng)主線程開啟的時候會自動的調(diào)用looper.prepare()方法創(chuàng)建一個looper對象,而looper對象中持有一個messagerqueue,當(dāng)子線程調(diào)用sendmessage()方法時,就會把這個message,存放到messagequeue中,而,looper中有一個for的死循環(huán),用來不斷的遍歷messagequeue中的message,messagequeue一有message就取出來,而message中有一個target(msg.target.dispatchmessage(msg)),這個份target就是handler。所以這個消息,最后交給handler的dispatch方法處理,而dispatch方法又會交給handlermessager處理。(handler、looper、messagequeue、message)。
這里還有一個問題,就是為什么不可以在子線程中彈吐司呢?因為在子線中無法得到loope對象。并綁定線程。如果想在子線程彈吐司,那么你的子線程必須要有l(wèi)ooper環(huán)境才行。吐司內(nèi)部會發(fā)消息,一是讓吐司顯示出現(xiàn),二是讓吐司隱藏,所以,吐司是依附于looper對象的。如果要在子線程中發(fā)消息給主線程呢?只要在子線程中,手動的調(diào)用Looper.prepare(),再創(chuàng)建一個handler對象重寫handlermessage()這個方法。最后手動調(diào)用Looper.looper()方法。在主線程中,調(diào)用sendmessage()方法,就可以再主線程中發(fā)消息給子線了。(Looper.mylooper()獲取當(dāng)前的looper對象,然后調(diào)用mylooper.quit()來停止循環(huán)。)
其他線程訪問主線程的幾種方式:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler
AsyncTask
Handler原理的簡單版本
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 1. ANR異常 Application No Response:應(yīng)用程序無響應(yīng)。在主線程中,是不允許執(zhí)行耗時的操...
- 文章獨家授權(quán)公眾號:碼個蛋更多分享:http://www.cherylgood.cn 談到Android開發(fā),就離...
- Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
- 預(yù)熱 在寫這篇文章前我不止一次的問自己,網(wǎng)上分析Handler機制原理的文章那么多,為啥還要畫蛇添足啊?不是說前人...
- Handler的由來 當(dāng)程序第一次啟動的時候,Android會同時啟動一條主線程(Main Thread)來負(fù)責(zé)處...