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();
參照源碼:
|