handler,message,looper學習筆記

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.

相關文章
相關標籤/搜索