Handler 機制(一)—— Handler的實現流程


  

因爲Android採用的是單線程模式,開發者沒法在子線程中更新 UI,因此係統給我提供了 Handler 這個類來實現 UI 更新問題。本貼主要說明 Handler 的工做流程。安全

1. Handler 的做用

在Android爲了保障線程安全,規定只能由主線程來更新UI信息。而在實際開發中,會常常遇到多個子線程都去操做UI信息的狀況,那麼就會致使UI線程不安全。這時,咱們就須要藉助 Handler 做爲媒介,讓 Handler 通知主線程按順序一個個去更新UI,避免UI線程不安全。網絡

那麼,子線程要更新UI的信息時,咱們就須要將要更新的消息傳遞到 UI主線程中,再由主線程完成更新,從而實現工做線程對UI的更新處理,最終完成異步消息的處理(如圖1所示)。數據結構

 

圖1 - 消息傳遞流程異步

 

 2. Handler 相關概念解釋

 主要涉及的有:處理器(Handler)、消息(Message)、消息隊列(Message Queue)、循環器(Looper)oop

概念spa

定義線程

做用code

備註對象

主線程blog

(Main Thread)

當應用第一次啓動時,

就會開啓一條主線程。

處理與UI相關的事件

主線程

通信媒介:Handler

子線程

子線程 人爲手動開啓的

執行耗時的操做

(如,網絡請求等)

消息

(Message)

線程間通信的數據單元

(即Handler接受/處理的對象)

存儲須要操做的信息  

消息隊列

(Message Queue)

一種數據結構

(隊:先進先出)

存儲Handler發來的消息

(Message)

 

處理者

(Handler)

◆ 主線程與子線程的通信媒介;

◆ 線程消息的處理者。           

◆ 添加消息(Message)到消息隊列(Message Queue);

◆ 處理由循環器(Looper)分配過來的消息(Message)。 

 

循環器

(Looper)

消息隊列(Message Queue)與 Handler的通信媒介

消息循環即:

◆ 消息獲取:循環取出消息隊列(Message Queue)中的消息(Message);

◆ 消息分發:將取出的消息(Message)發送給對應的處理者(Handler)。

 

 

3. 工做原理及流程

Handler 機制流程主要包含4個步驟:

        ① 異步通信;

        ② 消息發送;

        ③ 消息循環;

        ④ 消息處理。

詳情以下表所示:

步驟 具體描述 備註
① 異步通信

在主線程中建立:

◆ 處理器對象(Looper)

◆ 消息隊列對象(Message Queue)

◆ Handler對象

◆ Looper、Message Queue均屬於主線程;

◆ 建立完Message Queue後,Looper自動進行消息循環;

◆ 此時,Handler自動綁定到主線程的Looper和Message Queue。

② 消息發送 子線程經過Handler發送消息消息(Message)到消息隊列(Message Queue)中。 消息內容 =  子線程對UI的操做
③ 消息循環

◆ 消息出隊:Looper從消息隊列(Message Queue)中循環取出消息(Message);

◆ 消息分發:Looper將取出的消息(Message)分發給消息的處理者(Handler)。

在消息循環過程當中,若是消息隊列爲空,則自動阻塞。
④ 消息處理

◆ 處理者(Handler)接受處處理器(Looper)發送過來的消息(Message);

◆ 處理者(Handler)根據消息(Message)進行處理。

 

 

工做流圖(如圖2所示):

 

圖2 - Handler 機制工做流圖

 

4. 總結

最後須要注意幾點:

線程(Thread)、循環器(Looper)、處理器(Handler)之間的關係以下:

  • 一個線程(Thread)只能綁定一個循環器(Looper);但一個Thread能夠有多個處理器(Handler)。
  • 一個循環器(Looper)可綁定多個處理器(Handler)。
  • 一個處理器(Handler)只能綁定一個循環器(Looper)。

 

圖3 - Thread、Looper、Handler 之間的關係

相關文章
相關標籤/搜索