標籤:
http://blog.csdn.net/caesardadi/article/details/8473777
當應用程式啟動時,會開啟一個主線程(也就是UI線程),由她來管理UI,監聽使用者點擊,來響應使用者並分發事件等。所以一般在主線程中不要執行比較耗時的操作,如連網下載資料等,否則出現ANR錯誤。所以就將這些操作放在子線程中,但是由於AndroidUI線程是不安全的,所以只能在主線程中更新UI。Handler就是用來 子線程和建立Handler的線程進行通訊的。
Handler的使用分為兩部分:
一部分是建立Handler執行個體,重載handleMessage方法,來處理訊息。
[java] view plain copy
- mProgressHandler = new Handler()
- {
- public void handleMessage(Message msg)
- {
- super.handleMessage(msg);
- }
- };
當然,也可繼承自Handler,同樣要實現handleMessage(Message msg)方法。
[java] view plain copy
- class MyHandler extends Handler {
- public MyHandler() {
- }
-
- // 子類必須重寫此方法,接受資料
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- Log.d("MyHandler", "handleMessage......");
- super.handleMessage(msg);
-
- }
- }
另一部分是分發Message 或者Runable對象到Handler所在的線程中,一般Handler在主線程中。
Handler中分發訊息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int what)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
handler本身不僅可以發送訊息,還可以用post的方式添加一個實現Runnable介面的匿名對象到訊息佇列中,在目標收到訊息後就可以回調的方式在自己的線程中執行run的方法體。
Message
[java] view plain copy
- Message message = Message.obtain();
- message.arg1 = 1;
- message.arg2 = 2;
- message.obj = "Demo";
- message.what = 3;
- Bundle bundleData = new Bundle();
- bundleData.putString("Name", "Lucy");
- message.setData(bundleData);
Message 可以傳遞的參數有:
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()。
參考
Android Handler Message總結