Handler 機制簡單解釋

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()的調用須在同一個線程

  1. A線程:Looper.prepare(); 該方法執行以下操作:

    • new Looper(); Looper構造函數會執行以下操作:

      創建消息隊列 mQueue = new MessageQueue()
      持有當前線程 mThread = Thread.currentThread();

    • 通過 sThreadLocal.set(new Looper()) 與當前線程綁定
      爲保證 looper 對象唯一,每個線程只能prepare一次
  2. A線程:handler = new Handler();Handler會執行以下操作:

    通過Looper.myLooper() 持有 looper 對象
    通過looper.mQueue 持有 MessageQueue 對象

  3. A線程:Loop.loop(); loop方法會執行以下操作:

    • 通過 myLooper() 得到 looper 對象
    • 通過 looper.mQueue 得到 MessageQueue 對象 queue
    • 創建for(;;)死循環:

      通過queue.next() 得到 Message 對象 msg
      通過msg.target.dispatchMessage(msg) 最終調用 handler.handleMessage(msg) 方法
      另外,通過 looper.quit() 可以結束這個死循環

  4. B線程:handler.sendMessage(message); 該方法執行以下操作:

    1. message 通過 message.target = this 持有handler
    2. 通過 enqueueMessage(queue, message, uptimeMillis) 將message添加到 MessageQueue 消息隊列中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章