handler消息傳遞機制android
1.循環者looper類ide
一個線程對應一個looper對象,而一個looper對象又對應一個messagequeue。messagequeue用於存放message,在messagequeue中,存放的消息按照FIFO原則執行,messagequeu被封裝到looper裏面。函數
looper對象用來爲一個線程開啓一個消息循環,用來操做messagequeue,默認狀況下,android中斷建立的線程是沒有開啓消息循環的,可是主線程除外,系統自動爲主線程建立looper對象,開啓消息隊列。因此,在主線程中,運用Handler handler = new Handler();建立handler對象是不會出錯的,但在子線程中建立就會有異常。oop
若是想在非主線程中建立handker對象,首先需使用looper類的perpare()方法來初始化一個looper對象,而後建立這個handler,再使用looper類的loop()方法啓動looper(),從消息隊列中獲取和處理消息。post
public class LooperThread extends Thread{ui
public Handler handler;線程
@override對象
public void run(){隊列
super.run();內存
Looper.prepare();
//實例化handler
handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 1:...;break;
case 2:...;break;
}
}
};
Message m = handler.obtainMessage(); // 獲取一個消息
m.what = 1; //設置Message的what屬性
handler.sendMessage(m);
Looper.loop(); //啓動Looper
}
}
在主線程中建立該線程並啓動。
注意:寫在looper.loop()以後的代碼不會被執行,該函數內部是一個循環,當調用Handler.getLooper().quit()方法以後,loop()纔會停止。
2.消息處理類Handler
兩個做用:
(1)將message或runnable應用post或Runnable()方法發送到messagequeue中,在發送時,能夠指定延遲時間,發送時間和要攜帶的bundler數據,當messagequeue循環到該message時,調用相應的handler對象的handlerMessage()方法對其進行處理。
(2)在子線程中與主線程進行通訊,也就是在工做線程中與UI線程進行通訊。
說明:在一個線程中,只能有一個looper和messagequeue,但能夠有多個handler,handler共享一個messageQueue和looper.
3.Message
消息類被存在MessageQueue中,一個messageQueue中能夠包含多個Message對象,每一個Message對象能夠經過Message.obtain()得到或者handler.obtainMessage().
使用Message類的屬性能夠攜帶int型數據,可是若是要攜帶其餘類型的數據,能夠先將要攜帶的數據保存到Bundler對象中,而後經過Message類的setData()方法將其添加到Message中。
注意:
(1)儘管message有,默認的構造方法,可是一般狀況下,須要使用Message.obtain()方法或者hangler.obtainMessage()方法來從消息池中得到空消息對象,以節省資源。
(2)若是一個Message只須要攜帶簡單的int信息,應優先使用Message.arg0,和Message.arg1屬性來傳遞消息,這筆用Bundler更省內存。
(3)儘量使用Message.what來白哦是信息,以便用不一樣方式處理message.