Looper.loop() android線程中的消息循環

Looper用於封裝了android線程中的消息循環,默認情況下一個線程是不存在消息循環(message loop)的,需要調用Looper.prepare()來給線程創建一個消息循環,調用Looper.loop()來使消息循環起作用,從消息隊列裏取消息,處理消息。

注:寫在Looper.loop()之後的代碼不會被立即執行,當調用後mHandler.getLooper().quit()後,loop纔會中止,其後的代碼才能得以運行。Looper對象通過MessageQueue來存放消息和事件。一個線程只能有一個Looper,對應一個MessageQueue。


以下是Android API中的一個典型的Looper thread實現:

//Handler不帶參數的默認構造函數:new Handler(),實際上是通過Looper.myLooper()來獲取當前線程中的消息循環,
//而默認情況下,線程是沒有消息循環的,所以要調用 Looper.prepare()來給線程創建消息循環,然後再通過,Looper.loop()來使消息循環起作用。


class LooperThread extends Thread
{
public Handler mHandler;
public void run() 
{
Looper.prepare();
mHandler = new Handler() 
{
public void handleMessage(Message msg) 
{
// process incoming messages here
}
};
Looper.loop();
}


另,Activity的MainUI線程默認是有消息隊列的。所以在Activity中新建Handler時,不需要先調用Looper.prepare()。

什麼時候使用Looper.prepare()

當你的線程想擁有自己的MessageQueue的時候先Looper.prepare(),然後Looper.loop();

參照源碼:

public static final void prepare() {   
       if (sThreadLocal.get() != null) {   
           throw new RuntimeException("Only one Looper may be created per thread");   
       }   
       sThreadLocal.set(new Looper());   
   }   



這段代碼就是通過ThreadLocal來產生一個Looper對象做爲線程局部變量,然後調用Looper.loop()則是取出Looper對象中的MessageQueue進行消息循環了,這樣形成了這個線程的消息隊列。
一般情況下只會有主線程會調用prepare方法(ActivityThread的main函數)。
 

使線程擁有自己的消息列隊,主線程擁有自己的消息列隊,一般線程創建時沒有自己的消息列隊,消息處理時就在主線程中完成,如果線程中使用Looper.prepare()和Looper.loop()創建了消息隊列就可以讓消息處理在該線程中完成

http://blog.csdn.net/lwuit/article/details/6796464

發佈了0 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章