Android Handler Message總結

http://blog.csdn.net/caesardadi/article/details/8473777java

    當應用程序啓動時,會開啓一個主線程(也就是UI線程),由她來管理UI,監聽用戶點擊,來響應用戶並分發事件等。因此通常在主線程中不要執行比較耗時的操做,如聯網下載數據等,不然出現ANR錯誤。因此就將這些操做放在子線程中,可是因爲AndroidUI線程是不安全的,因此只能在主線程中更新UI。Handler就是用來 子線程和建立Handler的線程進行通訊的。安全

 

         Handler的使用分爲兩部分:ide

         一部分是建立Handler實例,重載handleMessage方法,來處理消息。函數

 

 

[java]  view plain  copy
 
  1. mProgressHandler = new Handler()  
  2.         {  
  3.             public void handleMessage(Message msg)  
  4.             {  
  5.                 super.handleMessage(msg);  
  6.             }  
  7.         };  


         固然,也可繼承自Handler,一樣要實現handleMessage(Message msg)方法。post

 

 

[java]  view plain  copy
 
  1. class MyHandler extends Handler {  
  2.         public MyHandler() {  
  3.         }  
  4.   
  5.         // 子類必須重寫此方法,接受數據  
  6.         @Override  
  7.         public void handleMessage(Message msg) {  
  8.             // TODO Auto-generated method stub  
  9.             Log.d("MyHandler", "handleMessage......");  
  10.             super.handleMessage(msg);  
  11.   
  12.         }  
  13.     }  


              另外一部分是分發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對象

 

[java]  view plain  copy
 
  1. Message message = Message.obtain();  
  2.        message.arg1 = 1;  
  3. message.arg2 = 2;  
  4. message.obj = "Demo";  
  5. message.what = 3;  
  6. Bundle bundleData = new Bundle();  
  7. bundleData.putString("Name", "Lucy");  
  8. message.setData(bundleData);  



 

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()。

         參考

相關文章
相關標籤/搜索