Handler 主要用於線程間通信
四個要素
以下解釋摘抄自<<第一行代碼>>:
- Message:
Message 是在線程之間傳遞的消息,它可以在內部攜帶少量的信息, 用於在不同線程間傳遞數據. Message 的what,arg1和arg2 字段用來攜帶整型數據, obj 字段用來攜帶一個 Object 對象. - Handler:
Handler 顧名思義就是處理者的意思, 它主要是用於發送和處理消息. 發送消息一般是使用 Handler 的 sendMessage() 方法,post() 方法等, 而發出的消息經過一系列的輾轉處理後, 最終會傳遞到 Handler 的 handlerMessage() 方法中. - MessageQueue:
MessageQueue 是消息隊列的意思, 它主要用於存放所有通過 Handler 發送的消息. 這部分消息會一直存在於消息隊列中, 等待被處理. 每個線程中只會有一個 MessageQueue 對象. - Looper:
Looper 是每個線程中的MessageQueue 的管家,調用 Looper 的 loop() 方法後, 就會進入一個無限循環當中, 然後每當發現 MessageQueue 中存在一條消息時,就會將它取出, 並傳遞到 Handler 的 handleMessage() 方法中. 每個線程中只會有一個 Looper 對象.
源碼簡單解釋
創建handler對象前,須確保handler所在的線程已調用過
Looper.prepare()
Looper.prepare()、new Handler()、Loop.loop()
的調用須在同一個線程
-
A線程:Looper.prepare(); 該方法執行以下操作:
new Looper();
Looper構造函數會執行以下操作:創建消息隊列 mQueue = new MessageQueue()
持有當前線程 mThread = Thread.currentThread();- 通過 sThreadLocal.set(new Looper()) 與當前線程綁定
爲保證 looper 對象唯一,每個線程只能prepare一次
-
A線程:
handler = new Handler();
Handler會執行以下操作:通過Looper.myLooper() 持有 looper 對象
通過looper.mQueue 持有 MessageQueue 對象 -
A線程:
Loop.loop();
loop方法會執行以下操作:- 通過 myLooper() 得到 looper 對象
- 通過 looper.mQueue 得到 MessageQueue 對象 queue
- 創建for(;;)死循環:
通過queue.next() 得到 Message 對象 msg
通過msg.target.dispatchMessage(msg) 最終調用 handler.handleMessage(msg) 方法
另外,通過 looper.quit() 可以結束這個死循環
-
B線程:
handler.sendMessage(message);
該方法執行以下操作:- message 通過
message.target = this
持有handler - 通過 enqueueMessage(queue, message, uptimeMillis) 將message添加到 MessageQueue 消息隊列中
- message 通過