android中MessageQueue,Message,Looper,handler的關係

一、幾個關鍵概念

1
MessageQueue:是一種
數據 結構,見名知義,就是一個消息隊列,存放消息的地方。每一個線程最多只可以擁有一個MessageQueue數據結構。
創建一個線程的時候,並不會自動 創建其MessageQueue。通常使用一個Looper對象對該線程的MessageQueue進行管理。主線程創建時,會創建一
個默認的Looper對象,而Looper對象的創建,將自動創建一個Message Queue。其他非主線程,不會自動創建Looper,要需要的時候,通過調
prepare函數來實現。

2
Message:消息對象,Message Queue中的存放的對象。一個Message Queue中包含多個Message

Message
實例對象的取得,通常使用Message類裏的靜態方法obtain(),該方法有多個重載版本可供選擇;它的創建並不一定是直接創建一個新的實例,
而是先從Message Pool(消息池)中看有沒有可用的Message實例,存在則直接取出返回這個實例。如果Message Pool中沒有可用的Message實例,
則才用給定的參數創建一個Message對象。調用removeMessages()時,將MessageMessage Queue中刪除,同時放入到Message Pool中。除了上面這
種方式,也可以通過Handler對象的obtainMessage()獲取 一個Message實例。

3
Looper

MessageQueue的管理者。每一個MessageQueue都不能脫離Looper而存在,Looper對象的創建是通過prepare函數來實現的。同時每一個Looper對象
和一個線程關聯。通過調用Looper.myLooper()可以獲得當前線程的Looper對象
創建一個Looper對象時,會同時創建一個MessageQueue對象。除了主線程有默認的Looper,其他線程默認是沒有MessageQueue對象的,所以,不能
接受Message。如需要接受,自己定義 一個Looper對象(通過prepare函數),這樣該線程就有了自己的Looper對象和MessageQueue數據結構了。
Looper
MessageQueue中取出Message然後,交由HandlerhandleMessage進行處理。處理完成後,調用Message.recycle()將其放入Message Pool中。

4
Handler

消息的處理者,handler 負責將需要傳遞的信息封裝成Message,通過調用handler 對象的obtainMessage()來實現;
將消息傳遞給Looper,這是通過
handler 對象的sendMessage()來實現的。繼而由LooperMessage放入MessageQueue中。
Looper對象看到MessageQueue中含有Message,就將其廣播出去。該
handler 對象收到該消息後,調用相應的handler對象的handleMessage()方法
對其進行處理。

 

 

 

 

在一個 非主線程中 必須要:

new Thread()

   {

      public void run()

      {

         Looper.prepare();

         new Handler()

         {

           handleMessage(){}

         }

         Looper.loop();

      }

   }.start()

 

這樣 無效:

new Thread()

   {

      public void run()

      {

       //  Looper.prepare();

         new Handler()

         {

           handleMessage(){}

         }

         //Looper.loop();

      }

   }.start()

 

 

 

正因爲這樣  出現了 HandlerThread  簡化了這樣的寫法

直接HandlerThread   thread = new HandlerThread  (“必須要有一個線程名字”);

必須 thrad.start();

才能通過thread.getLoopr()  來得到一個Handler

eg: new Handler(thread.getLooper()){

    ............

};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章