不可描述的Handler -_-

一. Handler是什么

Handler是Android給開發(fā)者提供用來用來更新UI的一套機制, 也是一套消息處理機制, 開發(fā)者可以發(fā)送消息, 也可以通過它處理消息

二. 為什么要用Handler

Android在設(shè)計的時候, 就封裝了一套消息創(chuàng)建、傳遞、處理機制. 如果不遵循這樣的機制就沒有辦法更新UI消息, 就會拋出異常信息

三. 怎么使用Handler
sendMessage(); 
sengMessageDelayed(); 
post(Runnable); 
postDelayed(Runnable, long); 
四. Handler的組成
  • Handler
    封裝了消息的方法(主要包括消息發(fā)送給誰), 將消息發(fā)送給Looper
  • Looper
    • 內(nèi)部包含一個消息隊列,也就是MessageQueue, 所有的Handler發(fā)送的消息都走向這個消息隊列
    • Looper.loop()方法, 就是一個死循環(huán), 不斷地從MessageQueue中取消息, 如有消息就處理消息, 沒有消息就阻塞
  • MessageQueue
    就是一個消息隊列, 可以添加消息, 并處理消息
五. Handler的原理

Handler內(nèi)部會跟Looper進(jìn)行關(guān)聯(lián), 也就是說在Handler內(nèi)部可以找到Looper, 找到Looper也就找到了MessageQueue, 在Handler中發(fā)送消息,
其實就是向MessageQueue隊列中發(fā)送消息

思考: Android為什么要設(shè)計只能通過Handler機制更新UI?

最根本的目的是解決多線程并發(fā)問題

假設(shè)一個場景: 在一個Activity當(dāng)中, 有多個線程去更新UI

問題一: 更新UI時并且都沒有進(jìn)行加鎖處理, 那么會產(chǎn)生什么樣的問題 -- 更新界面錯亂
問題二: 如果對更新UI的操作都進(jìn)行加鎖處理的話, 又會產(chǎn)生什么樣的問題 -- 性能下降

基于對以上問題的考慮, Android給開發(fā)者提供了一套更新UI的機制,
我們只需遵循這樣的機制就可以了; 根本不用去關(guān)心多線程的問題, 所有更新UI的操作, 都要在主線程的消息隊當(dāng)中去輪詢處理的

總結(jié)
  • Handler負(fù)責(zé)發(fā)送消息, Looper負(fù)責(zé)接收Handler發(fā)送的消息, 并直接把消息回傳給Handler
  • MessageQueue就是一個存儲消息的容器
最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容