1. 程式人生 > >對handler的一些簡單理解

對handler的一些簡單理解

android中的Handler Looper Message MessageQueue相互關係

1.handler用於主執行緒和子執行緒之間的相互通訊,通常是new handler,實現handlemessage方法來對message進行處理,而且在初始化handler的方法中必須傳入一個Looper,如果在主執行緒newhandler,那麼就共享主執行緒的looper,存在主執行緒的threadlocal(執行緒級共享)中;如果在子執行緒new handler,那麼必須呼叫looper.prepare方法,然後還得呼叫looper.loop方法來輪詢MessageQueue訊息佇列,這裡又有一個重要的感念:訊息佇列,他是一個存放handler傳送訊息的容器,但是,存放Message並非實際意義的儲存,而是將Message以連結串列的方式串聯起來的,等待Looper的抽取。預設遵循FIFO(先入先出)規則,也可以指定when屬性來自定義message的執行順序.他是在looper的初始化是建立的.一個執行緒只能有一個訊息佇列–為什麼?因為一個執行緒只能有一個Looper啊!訊息佇列中可以存放多個message,當我們呼叫Message.obtain()或者Handler.obtainMessage()獲取Message物件,先判斷訊息池中有沒有message,如果有就直接返回這個例項,沒有則建立一個新的例項,呼叫removeMessages()時,將Message從MessageQueue中刪除,同時放入到訊息池中。當looper.loop取出一個訊息後,會將這個訊息回傳給傳送訊息的handler來處理—-誰傳送,誰處理.這是怎麼實現的呢?其實內部有一個message.target = this,而這個this其實就是handler.looper.loop內部有一個while(true)死迴圈,會不停的輪詢,當messagequeue中沒有訊息時,迴圈會阻塞,不會無限迴圈下去.
public class LooperThread extends Thread {
@Override
public void run() {
// 將當前執行緒初始化為Looper執行緒
Looper.prepare();
// ...其他處理,如例項化handler
// 開始迴圈處理訊息佇列
Looper.loop();
}
}


2.接下來,簡單的看一下訊息的迴圈過程:
(1)生成
Message msg = mHandler.obtainMessage();
msg.what = what;
msg.sendToTarget();

(2)傳送

      MessageQueue queue = mQueue;
        if (queue != null) {
            msg.target = this;
            sent = queue.enqueueMessage(msg, uptimeMillis);
        }

沒有寫完,有時間再補充