標籤:adl get open float one top logs 資料 www
每個Android應用在啟動的時候都會建立一個線程。這個線程被稱為主線程或者UI線程。Android應用的全部操作預設都會執行在這個線程中。
可是當我們想要進行資料請求,圖片下載。或者其它耗時操作時,是不可能在這個UI線程做的。由於Android在3.0以後的版本號碼已經禁止了這件事情,直接拋出一個異常。所以我們須要一個子線程來處理那些除UI操作的事情。
可是這個又會有一個問題。我們僅僅能在UI線程進程UI操作,僅僅能在子線程進行耗時操作。假設我們須要在耗時操作結束後在Android介面上顯示一個View,我們應該怎麼做?我們是不可能在子線程直接重新整理UI的。這時我們須要用到Android的訊息機制。來實現主線程和子線程的通訊。簡單來說,就是子線程擷取到資料之後,不直接進行UI更新,而是把資料裝到訊息中發送到主線程,主線程中有一個迴圈輪詢會馬上收到子線程發過來的資訊,然後拿到訊息資料後在主線程更新UI 。說起來比較簡單。我們來細緻的看一下詳細是怎麼說的。
處理訊息的手段——Handler, Looper, MessageQueueHandler
我們先解說一下Handler,Handler顧名思義就是處理者,通常對他的使用方法是在UI線程中建立一個Handler,並覆寫他的handleMessage, 然後再耗時的線程中將訊息post給UI線程。範例例如以下:
class MyHandler extends Handler{ @Override public void handleMessage(Message msg){ //更新UI }}MyHandler mHandler = new MyHandler();new Thread(){ public void run(){ mHandler.sendEmptyMessage(123); };}.start();
這裡規定了Handler必須在主線程建立。由於僅僅有在UI線程建立才會讓Handler關聯到已有的MessageQueue。
而MessageQueue被封裝到Looper中,而Looper又通過ThreadLocal封裝到一個線程中。最後相當於MessageQueue關聯了一個線程。所以簡單來說就是Handler將訊息投遞到一個關聯了線程的MessageQueue中,然後Handler在從MessageQueue中取出訊息,而且處理它。
我們看一下Handler的2個經常使用的方法
void handleMessage(Message msg) : 處理訊息的方法
final boolean sendMessage(Message msg) : 馬上發送訊息
第一個方法 我們通常在