1. 程式人生 > >Looper、Handler在子執行緒中的應用

Looper、Handler在子執行緒中的應用

Looper類:為一個執行緒開啟一個訊息迴圈,裡面有一個訊息佇列,新執行緒是沒有開啟訊息迴圈的,所以需要用到Looper的方法建立訊息迴圈(主執行緒除外,主執行緒會自動為其建立Looper物件,開啟訊息迴圈),MessageQueue存放訊息和事件 Handler類:輔助類,向繫結的Looper投遞訊息 Looper原型: Looper.prepare() Looper.loop Looper.quit 程式碼:
  1. package com.test.looper;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import
     android.os.Handler;  
  5. import android.os.Looper;  
  6. import android.os.Message;  
  7. import android.util.Log;  
  8. publicclass MainActivity extends Activity {  
  9.     private LooperThread  looperThread;  
  10.     @Override
  11.     publicvoid onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.         looperThread = new LooperThread();  
  15.         looperThread.start();  
  16.         looperThread.getHandler().sendEmptyMessage(1);  
  17.     }  
  18.     class LooperThread extends Thread {  
  19.         private Handler mHandler;  
  20.         privatefinal Object mSync = new
     Object();  
  21.         publicvoid run() {  
  22.             Looper.prepare();  
  23.             synchronized (mSync) {  
  24.                 mHandler = new Handler(){  
  25.                     @Override
  26.                     publicvoid handleMessage(Message msg) {  
  27.                         Log.d("CYQ""--->" + msg);  
  28.                     }  
  29.                 };  
  30.                 mSync.notifyAll();  
  31.             }  
  32.             Looper.loop();  
  33.         }  
  34.         public Handler getHandler() {  
  35.             synchronized (mSync) {  
  36.                 if (mHandler == null) {  
  37.                     try {  
  38.                         mSync.wait();  
  39.                     } catch (InterruptedException e) {  
  40.                     }  
  41.                 }  
  42.                 return mHandler;  
  43.             }  
  44.         }  
  45.         publicvoid exit() {  
  46.             getHandler().post(new Runnable(){  
  47.                 publicvoid run() {  
  48.                     Looper.myLooper().quit();  
  49.                 }});  
  50.         }  
  51.     }  
  52. }  
注意一下幾點:

1、new Handler()必須在子執行緒的run方法中,否則不是子執行緒的Handler

2、在getHandler方法中,我加入了同步,防止執行緒start了,但是並沒有run結束,若此時直接返回mHandler會是一個null(不行可以試試,我一開始鬱悶許久,最後在原始碼中發現有更穩定的實現,所以效仿了,

後記:

看來原始碼還是寫得很健壯的,仍需多加學習!

總結一下(也許不對,請懷疑):

一個執行緒有一個對應的Looper,這個Looper就是訊息迴圈,我理解就是提供了一個訊息迴圈的場所,但是訊息的投遞,訊息的處理它不做,它會繫結一個Handler,然後Handler去投遞和處理訊息,一個執行緒中實現handleMessage,另外一個執行緒就可以sendMessage,執行緒可以主或者子,進而實現執行緒間訊息的傳遞。