Handler的定義:
主要接受子線程發送的數據, 並用此數據配合主線程更新UI.
解釋: 當應用程序啓動時,Android首先會開啓一個主線程 (也就是UI線程) , 主線程爲管理界面中的UI控件,進行事件分發, 好比說, 你要是點擊一個 Button ,Android會分發事件到Button上,來響應你的操做。 若是此時須要一個耗時的操做,例如: 聯網讀取數據, 或者讀取本地較大的一個文件的時候,你不能把這些操做放在主線程中,,若是你放在主線程中的話,界面會出現假死現象, 若是5秒鐘尚未完成的話,,會收到Android系統的一個錯誤提示 "強制關閉". 這個時候咱們須要把這些耗時的操做,放在一個子線程中,由於 子線程涉及到UI更新,,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操做是危險的. 這個時候,Handler就出現了.,來解決這個複雜的問題 , 因爲Handler運行在主線程中(UI線程中), 它與子線程能夠經過Message對象來傳遞數據, 這個時候,Handler就承擔着接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(裏面包含數據) , 把這些消息放入主線程隊列中,配合主線程進行更新UI。
Handler 概念解釋:
handler類容許你發送消息和處理線程消息隊列中的消息及runnable對象。handler實例都是與一個線程和該線程的消息隊列一塊兒使用,一旦 建立了一個新的handler實例,系統就把該實例與一個線程和該線程的消息隊列捆綁起來,這將能夠發送消息和runnable對象給該消息隊列,並在消 息隊列出口到處理它們。
handler類有兩種主要用途:1。按照時間計劃,在將來某時刻,對處理一個消息或執行某個runnable實例。2。把一個對另外線程對象的操做請求放入消息隊列中,從而避免線程間衝突。
時間類消息經過以下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)
methods. post之類函數能夠傳輸一個runnable對象給消息隊列,並在到達消息隊列後被調用。sendmessage之類函數能夠傳送一個包含數據的 message對象,該message對象能夠被Handler類的handleMessage(Message) 方法所處理。
post之類函數和sendmessage之類的函數均可以指定消息的執行時機,是當即執行、稍後一段時間執行,仍是在某個肯定時刻執行。這能夠用來實現超時、消息或其餘時間相關的操做。
當一個進程啓動時,主線程獨立執行一個消息隊列,該隊列管理着應用頂層的對象(如:activities、broadcast receivers等等)和全部建立的窗口。你能夠建立本身的一個線程,並經過handler來與主線程進行通訊。這能夠經過在新的線程中調用主線程的 handler的post和sendmessage操做來實現。
HandlerThread/Looper & MessageQueue & Message的關係:
handler 負責將須要傳遞的信息封裝成Message,經過handler 對象的sendMessage()來將消息傳遞給Looper,由Looper將Message放入MessageQueue中。當Looper對象看到 MessageQueue中含有Message,就將其廣播出去。該handler 對象收到該消息後,調用相應的handler對象的handleMessage()方法對其進行處理。
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對象到隊列中,等待更新.