Android Handler Message總結

來源:互聯網
上載者:User

標籤:

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

    當應用程式啟動時,會開啟一個主線程(也就是UI線程),由她來管理UI,監聽使用者點擊,來響應使用者並分發事件等。所以一般在主線程中不要執行比較耗時的操作,如連網下載資料等,否則出現ANR錯誤。所以就將這些操作放在子線程中,但是由於AndroidUI線程是不安全的,所以只能在主線程中更新UI。Handler就是用來 子線程和建立Handler的線程進行通訊的。

 

         Handler的使用分為兩部分:

         一部分是建立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)方法。

 

 

[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在主線程中。

 

 

              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 
  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 可以傳遞的參數有:

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總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.