android-handler、looper、messageQueue、message

來源:互聯網
上載者:User

標籤:

  Handler建立,必須有個一個Looper,主線程自己建立了。其他線程需要自己建立,預設是沒有的。建立方法

  1. 這種方法是先建立一個系統定義好的HandlerThread,這個是跑在非UI線程中的,已經建立好了looper,直接用就可以了.建立handler有多個建構函式,具體看源碼

    HandlerThread threadhandler = new HandlerThread("1111");
    threadhandler.start();
    myhandler = new myHandler(threadhandler.getLooper());

   2. 自己建立一個新的線程,線上程中調用Looper.prepare();然後寫處理message回調方法,接著還要調用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();
}
}
  為什麼一定要有一個Looper呢?
  因為handler的無參數建構函式裡需要looper,如果為空白就拋異常。
  如何設定looper?
調用Looper.prepare();這裡會判斷當前的線程是不是已經有looper了,有的話會拋異常,這就是說一個線程只能有一個looper。
Message是什麼,有什麼用?
存放訊息的用的,它有很多屬性。特別說明target,表示的就是處理它的handler,next屬性,這就是利用了鏈表結構來構造的訊息佇列,message.next表示著當前訊息的下一個,是按照時間來的,只能順序不能反過來,他沒有prev屬性。
MessageQueue是什麼,有什麼用?
用來操作messages,例如handler發送訊息過來,他需要把訊息按照順序串起來。還有處理完訊息後他需要把訊息從訊息佇列中刪除等等。
handler有什麼用?
發送和處理訊息。handler通過sendmessage等方法發送訊息,最終都是通過sendMessageAtTime來處理髮送給MessageQueue。然後通過looper回呼函數msg.target.dispatchMessage(msg)-->handler的handleMessage()方法具體處理。
handler還可以使用post方法將runnable傳給訊息佇列message有callback屬性,在looper的dispatchMessage()方法中,如果是runnable就直接run()了;

最後有個疑問:到底是什麼樣的機制可以讓looper迴圈去處理message?

   while (true) {  

          Message msg = queue.next(); // might block    

     if (msg != null) {  

    if (msg.target == null) {    

      return;  

            }  

    if (me.mLogging!= null) me.mLogging.println(  ">>>>> Dispatching to " + msg.target + " "  

     + msg.callback + ": " + msg.what   );  

    msg.target.dispatchMessage(msg);  

    if (me.mLogging!= null) me.mLogging.println(  "<<<<< Finished to    " + msg.target + " "  

     + msg.callback);  

      msg.recycle();  

    }  

  看到Message msg = queue.next(); // might block 這句話,獲得待處理的message,這裡可能會堵塞,沒有message的時候就迴圈等待,直到messageQueue退出


android-handler、looper、messageQueue、message

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.