http://blog.csdn.net/caesardadi/article/details/8473777java
當應用程序啓動時,會開啓一個主線程(也就是UI線程),由她來管理UI,監聽用戶點擊,來響應用戶並分發事件等。因此通常在主線程中不要執行比較耗時的操做,如聯網下載數據等,不然出現ANR錯誤。因此就將這些操做放在子線程中,可是因爲AndroidUI線程是不安全的,因此只能在主線程中更新UI。Handler就是用來 子線程和建立Handler的線程進行通訊的。安全
Handler的使用分爲兩部分:ide
一部分是建立Handler實例,重載handleMessage方法,來處理消息。函數
固然,也可繼承自Handler,一樣要實現handleMessage(Message msg)方法。post
另外一部分是分發Message 或者Runable對象到Handler所在的線程中,通常Handler在主線程中。spa
Handler中分發消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int what)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long).net
handler自己不只能夠發送消息,還能夠用post的方式添加一個實現Runnable接口的匿名對象到消息隊列中,在目標收到消息後就能夠回調的方式在本身的線程中執行run的方法體。線程
Message對象
Message 能夠傳遞的參數有:blog
1. arg1 arg2 整數類型,是setData的低成本替代品。傳遞簡單類型
2. Object 類型 obj
3. what 用戶自定義的消息代碼,這樣接受者能夠了解這個消息的信息。每一個handler各自包含本身的消息代碼,因此不用擔憂自定義的消息跟其餘handlers有衝突。
4.其餘的能夠經過Bundle進行傳遞
Message能夠經過new Message構造來建立一個新的Message,可是這種方式很很差,不建議使用。最好使用Message.obtain()來獲取Message實例,它建立了消息池來處理的。
公共構造器
public Message()
構造器(可是獲取Message對象的最好方法是調用Message.obtain())。
以下這些經過Message.obtain方式獲取Message實例,參數中傳遞了Handler,發送該消息時再也不使用handler.sendMessage這種方式。使用message.sendToTarget();不過歸根到底都是調用Handler.sendMessage進行發送消息。Message類中保存Handler實例。
public static Message obtain (Handler h, int what, int arg1, int arg2, Object obj)
與obtain()同樣,可是設置了target, what, arg1, arg2和obj的值。
參數
h 設置的target值
what 設置的what值
arg1 設置的arg1值
arg2 設置的arg2值
obj 設置的obj值
返回值
從全局池中分配的一個Message對象。
public static Message obtain (Handler h, int what, Object obj)
與obtain()同樣,可是設置了target, what和obj的值。
參數
h 設置的target值
what 設置的what值
obj 設置的obj值
返回值
從全局池中分配的一個Message對象。
public static Messageobtain (Handler h, int what)
與obtain()同樣,可是設置了target和what的值。
參數
h target的值
what what的值
返回值
從全局池中分配的一個Message對象。
public static Message obtain (Handler h)
與obtain()同樣,可是設置了target的值
參數
h 消息對象的target成員的值
返回值
從全局池中分配的一個Message對象。
public static Message obtain (Handler h, Runnable callback)
與obtain(Handler)同樣,可是設置回調函數,在Message返回時調用。
參數
h 消息對象的target成員的值
callback 當消息處理時會調用的回調函數
返回值
從全局池中分配的一個Message對象。
public static Message obtain ()
從全局池中返回一個新的Message實例。在大多數狀況下這樣能夠避免分配新的對象。
public static Message obtain (Handler h, int what, int arg1, int arg2)
與obtain()同樣,可是設置了target, what, arg1和arg2的值
參數
h 設置的targe值
what 設置的what值
arg1 設置的arg1值
arg2 設置的arg2值
返回值
從全局池中分配的一個Message對象。
public static Message obtain (Message obj)
同obtain(),可是從一個已存在的消息中拷貝值(包括它的目標)。
參數
orig 要拷貝的源消息
返回值
從全局池中分配的一個Message對象。
public Bundle peekData ()
與getData()類似,可是並不延遲建立Bundle。若是Bundle對象不存在返回null。更多信息見getData()。
參考