Handler是用于實現線程間通信和任務調度的一種機(Handler
、?Looper、MessageQueue
、?Message
)。Handler
?允許線程間發送Message
或Runnable
對象進行通信。在Android
中UI修改只能通過UI Thread
,子線程不能更新UI
。如果子線程想更新UI
,需要通過?Handler
發送消息給主線程,進而達到更新UI
的目的。
先創建一個與一個線程相關聯Handler實例(Handler與創建它的線程相關聯,而且也只與創建它的線程相關聯),在Handler的構造函數中獲取該線程的Looper對象,然后將Handler與Looper綁定。Handler通過post()、sendMessage()等方法將一個Message對象插入到Looper的MessageQueue中,Looper會不斷地從MessageQueue中取出Message并將其傳遞給Handler的dispatchMessage()方法,dispatchMessage()方法負責處理取出的Message,根據Message的類型執行相應的操作,如回調、更新UI等。
一個線程:只有一個Looper,只有一個MessageQueue,可以有多個Handler。
1.Message? (可攜帶數據通過what
、arg1
、arg2
、obj
字段)
攜帶:target=Handler(線程通過target標識發送Message給目標Handler)。
2.Message Queue
存放通過Handler
?發送的Message
?的消息隊列。
sendMessage發送消息時消息的時間when = SystemClock.uptimeMillis() + delayMillis
SystemClock.uptimeMillis()是手機開機相對時間二者加起來肯定不為0
3.Handler
消息處理者,用于發送和接收處理消息。
發送消息?sendMessage()
處理消息?handleMessage()
4.Looper
內部包含一個死循環的MessageQueue
,用于存儲handler
發送的Message
,Looper
則是不斷的從消息隊列中取消,如果有消息就取出發送給Handler
?處理,沒有則阻塞。
1、面試:Handler A發送的 Message 為啥不會跑到 Handler B的 HandleMessage中被處理?
回答:當handler發送消息時(enqueueMessage)會把自身作為Message的一個屬性值(msg.target)封裝到Message對象匯總一并發送到消息隊列中。 Looper輪循出消息會拿到消息的target屬性這樣就可以知道每條消息是屬于哪個hadler對象的。然后讓相應對象的handler進行消息處理。
2、面試:handler.post和handler.sendMessage的區別和聯系?
回答:1、handler.sendMessage通過Message
對象(可攜帶數據通過what
、arg1
、arg2
、obj
字段),傳遞復雜數據或區分不同消息類型的場景。
? ? ? ? ? 2、handler.post不需要Message
對象,直接傳遞Runnable
。簡單任務(如UI更新、延遲操作)
? ? ? ? ?3、底層聯系:
handler.post內部會將Runnable
包裝成一個Message
(設置callback
字段為該Runnable
),然后調用sendMessageDelayed()
。當Looper
處理該Message
時,會優先執行Runnable.run()
,而非handleMessage()
。
3、Looper死循環為什么不會導致ANR?
回答:應用卡死 ANR壓根與Looper沒有關系,應用在沒有消息需要處理的時候,他是在睡眠,釋放線程。卡死是ANR,是如果消息隊列里有消息,looper卻沒有及時處理導致的,和Looper是死循環無關。
4、怎么創建Message?
回答:
1.Message message = new message();? ?會創建一個全新的Message
對象,增加內存。
2.Message message = Message.obtain();?從全局的Message
對象池中獲取復用實例(避免重復創建)。
3.Message message = handler.obtainMessage();Handler關聯的池獲取,本質調用Message.obtain()
,但自動綁定當前Handler
。
相關文章:
Handler 使用方法介紹
安卓 Handler面試(1)_android handler機制面試-CSDN博客
【Android面試】Android線程間通信Handler消息機制_android handler機制面試-CSDN博客
AskManyAI