Android Handler和Looper總結

一、Handler的定義

主要接受子線程發送的數據, 並用此數據配合主線程更新UI。

當應用程序啓動時,Android首先會開啓一個主線程 (也就是UI線程) , 主線程爲管理界面中的UI控件, 進行事件分發, 比如說, 你要是點擊一個 Button ,Android會分發件到Button上,來響應你的操作。  如果此時需要一個耗時的操作,例如: 聯網讀取數據,    或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現假死現象, 如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示  "強制關閉"。  這個時候我們需要把這些耗時的操作,放在一個子線程中,因爲子線程涉及到UI更新,,Android主線程是線程不安全的, 也就是說,更新UI只能在主線程中更新,子線程中操作是危險的。 這個時候,Handler就出現了。來解決這個複雜的問題,由於Handler運行在主線程中(UI線程中),  它與子線程可以通過Message對象來傳遞數據, 這個時候,Handler就承擔着接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(裏面包含數據)  , 把這些消息放入主線程隊列中,配合主線程進行更新UI。

Handler的特點:

handler可以分發Message對象和Runnable對象到主線程中, 每個Handler實例,都會綁定到創建他的線程中(一般是位於主線程),它有兩個作用:
(1)安排消息或Runnable 在某個主線程中某個地方執行;
(2)安排一個動作在不同的線程中執行。
Handler中分發消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post類方法允許你排列一個Runnable對象到主線程隊列中,
sendMessage類方法, 允許你安排一個帶數據的Message對象到隊列中,等待更新。

Handler使用步驟:
a:在主線程中實例化Handler對象,並重寫handleMessage方法,處理子線程發過來的數據,數據是以Message對象進行傳遞
b:在子線程中使用主線程中實例化的Handler對象,調用send**或post**方法向主線程發送消息,在發送之前,數據應該封裝成Message對象


Looper

Android應用程序是通過消息來驅動的,系統爲每一個應用程序維護一個消息隊例,應用程序的主線程不斷地從這個消息隊例中獲取消息(Looper), 然後對這些消息進行處理(Handler)

發佈了30 篇原創文章 · 獲贊 19 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章