android的Handler是線程之間通信的唯一方式,這種方式初看我覺得就是一個回調接口的形式。很多時候,我們只要將handller的變量插入其他線程就能進行交互了。當然,Handler的實現過程,其實還是很複雜的。我自己總結了下:
Handler是依託於數據結構的。也就是,如果想進行線程間的通信,需要在被通信的線程的中維持一個Looper輪詢機構。在Looper中插入一個Message Queue數據集。而後,線程中的Looper就會處於無限循環的狀態。每次,在子線程中調用接口handler的sendEmptyMessage(Message msg)方法發送一個Message插入消息隊列;或者通過post(Runnable r)方法將一個Runnable對象插入消息隊列中——一般來說,這個Runnable對象對應的是Handler宿主ThreadLocal所有執行的動作,如果宿主是UiThread,那麼Runnalble中就可以進行有關Ui的操作。這也是post和handleMessage(Message msg)的區別所在。
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage){
<span style="white-space:pre"> </span>return;
}
handleMessage(msg);
}
}
以上這個代碼,起先看起來有些糊塗,在查看了源碼後,發現,post的調用其實還是Message的調用,把Runnable對象當作一個數據傳遞過去,再通過handleCaaBack(Message msg)進行處理。而如果沒有Runnable的對象,就會執行在宿主中複寫的接口handleMessage(Message msg)方法
而Handler的原理其實就是下圖:
以上理解來自:http://blog.csdn.net/bboyfeiyu/article/details/38555547#comments
這個連接有非常詳細的源碼解釋,我僅是做好自己的筆記,畢竟知識易丟