因爲Android採用的是單線程模式,開發者沒法在子線程中更新 UI,因此係統給我提供了 Handler 這個類來實現 UI 更新問題。本貼主要說明 Handler 的工做流程。安全
在Android爲了保障線程安全,規定只能由主線程來更新UI信息。而在實際開發中,會常常遇到多個子線程都去操做UI信息的狀況,那麼就會致使UI線程不安全。這時,咱們就須要藉助 Handler 做爲媒介,讓 Handler 通知主線程按順序一個個去更新UI,避免UI線程不安全。網絡
那麼,子線程要更新UI的信息時,咱們就須要將要更新的消息傳遞到 UI
主線程中,再由主線程完成更新,從而實現工做線程對UI
的更新處理,最終完成異步消息的處理(如圖1所示)。數據結構
圖1 - 消息傳遞流程異步
主要涉及的有:處理器(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)。 |
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 機制工做流圖
最後須要注意幾點:
線程(Thread)、循環器(Looper)、處理器(Handler)之間的關係以下:
圖3 - Thread、Looper、Handler 之間的關係