012android初級篇之Handler機制

設計Handler類的目的

Handler類被用來註冊到一個線程中,這樣能夠提供一個簡單的通訊渠道,用來發送數據到這個線程。
可做爲UI線程與後臺線程交互的幾種方法之一。html

具體用途

  1. 消息的分發和處理,安排 messages 和 runnables在將來某個時刻被執行;
  2. 隊列action在其餘線程上被執行;android

    與之相關的類:looper類,

    looper 主要功能是爲特定單一線程運行一個消息環。ide

  3. 一個線程對應一個looper。一樣一個looper對應一個線程。這就是所謂的特定單一;
  4. 通常狀況下,在一個線程建立時他自己是不會產生他特定單一的looper的(主線程是個例外)。所以咱們須要手動的把一個looper與線程相關聯。其方法只需在須要關聯的looper的線程中調用Looper.prepare。以後咱們再調用Looper.loop啓動looper。
    以下例子:函數

    class NetWorkThread implements Runnable 
     {
         public MyHandler mHandler =new MyHandler();
         @Override
         public void run() {
    
             Looper.prepare();
             //mHandler =new MyHandler();
             Looper.loop();
         }
     }
  5. 具體的說,在咱們將特定單一looper與線程關聯的時候,looper會同時生產一個messageQueue。他是一個消息隊列,looper會不停的從messageQuee中取出消息,也就是message。而後線程就會根據message中的內容進行相應的操做。
  6. looper和handler並不是一一對應的。一個looper能夠對應多個handler,而一個handler只能對應一個looper。handler和looper的綁定,是在構建handler的時候實現的,具體查詢handler的構造函數。
  7. message,雖然咱們能夠本身建立一個新的message,可是更加推薦的是調用handler的obtainMessage方法來獲取一個message。這個方法的做用是從系統的消息池中取出一個message,這樣就能夠避免message建立和銷燬帶來的資源浪費了。oop

假設A線程要傳遞信息給B線程,咱們須要作的就是

  1. 在B線程中調用Looper.prepare和Looper.loop。(主線程不須要)
  2. 編寫Handler類,重寫其中的handleMessage方法。
  3. 建立Handler類的實例,並綁定looper
  4. 調用handler的sentMessage方法發送消息。

實例代碼線程

NetWorkThread mNetWorkThread =new NetWorkThread();
new Thread(mNetWorkThread).start();
Message msg = mNetWorkThread.mHandler.obtainMessage();
msg.arg1=12;
mNetWorkThread.mHandler.sendMessage(msg);

Message相關

Message的使用樣例設計

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. public int arg1 arg2 整數類型,是setData的低成本替代品。傳遞簡單類型
  2. public Object object 類型
  3. public int what 用戶自定義的消息代碼,這樣接受者能夠了解這個消息的信息。每一個handler各自包含本身的消息代碼,因此不用擔憂自定義的消息跟其餘handlers有衝突。
  4. 其餘的能夠經過Bundle進行傳遞

Message的構造函數

Message能夠經過new Message構造來建立一個新的Message,可是這種方式很很差,不建議使用。最好使用Message.obtain()來獲取Message實例,它從消息池獲取。code

參考連接

  1. Android開發中Handler的經典總結
  2. Android background processing with Handlers, AsyncTask and Loaders - Tutorial
  3. Android中UI線程與後臺線程交互設計的5種方法
  4. Java中Runnable和Thread的區別
  5. Android:主線程如何向子線程發送消息
  6. android parcelable 詳解
相關文章
相關標籤/搜索