Posts Tagged ‘Android Driver’

Handler 與 HandlerThread 原理

十二月 2, 2009

在Android 程式裡 我們常用Handler來做 跨Thread的訊息溝通

Handler 允許你對 與Hanlder相互關聯的Thread MessageQueue,進行 “傳送" 及 “處理訊息(Message) 或 將可執行(Runable)的程序公布至這個Thread的MessageQueue, 待稍候 由這個Thread 來執行Runable 的內容.

當一個Handler被新建時…Handler 與 新建這個Handler的Thead MessageQueue 產生綁定,之後這個Handler 就會將訊息與可執行(Runable)的程序 傳送至這個Thread 的 MessageQueue

以下為Handler類別 常用的方法列表…post方法是將可執行的Runable 物件加入MessageQueue, 而send 方法 則為將訊息加入MessageQueue,

class Handler {

public interface Callback {
public boolean handleMessage(Message msg);
}

//將這個Handler 與建立這個Handler的Thread的MessageQueue 產生連結,當訊息自這個MessageQueue被Dispatch後 由這個handler的handleMessage(Message msg); 處理

public Handler();

//將這個Handler 與建立這個Handler的Thread的MessageQueue 產生連結,當訊息自這個MessageQueue被Dispatch後 由callback object的handleMessage方法處理

public Handler(Callback callback);

//將這個Handler 連結至 looper 的MessageQueue (Looper 只能跟Thread 並存), 當訊息自這個MessageQueue被Dispatch後 由這個handler的handleMessage(Message msg); 處理
public Handler(Looper looper);

//將這個Handler 連結至 looper 的MessageQueue (Looper 只能跟Thread 並存),當訊息自這個MessageQueue被Dispatch後 由callback object的handleMessage方法處理
public Handler(Looper looper, Callback callback);

//用來處理與這個Handler關聯Message Queue 的 non post message,在extend handler 假如你需要處理訊息 則override handleMessage
public void handleMessage(Message msg);

//Looper 自MessageQueue內取出 Message 後 假如這個訊息 由這個handler 所產生… 此dispatchMessage 就會被呼叫.
//當它為一般訊息時 呼叫handleMessage或與constructor傳進來的MessageCallback:handleMessage
//若為post message則執行message內的callback (從 post傳進的 runnable)

public void dispatchMessage(Message msg);

//將Runnable object 包裝成postMessage 並丟到這個Handler 連結的 MessageQueue
post(Runnable);
postAtTime(Runnable, long);
postDelayed(Runnable, long);

sendEmptyMessage(int);
sendMessage(Message);
sendMessageAtTime(Message, long);
sendMessageDelayed(Message, long);

}

class Looper {
public static final void prepare(); //新增一個looper instance至ThreadLocal
public static final Looper myLooper(); //從ThreadLocal 取回looper instance

public static final void loop(); //取回與這個Thread 關聯的looper, 並於迴圈內 取得MessageQueue 裡的訊息 並dispatch
public void quit(); //送出一個空訊息給Message 代表結束looper 迴圈

public static final MessageQueue myQueue(); 取得與這個Thread 關聯的MessageQueue
public Thread getThread(); 取得與這個looper 關聯的 Thread

}

class HandlerThread extends Thread{

public void run(); //呼叫Looper.prepare 新增Looper 至 Thread, 並呼叫Looper.loop 執行 MessageQueue

}