Java的消息機制

最近重新複習一下Android基本的知識點,增加強概念性瞭解,以及梳理平常使用最多的Android消息處理機制(Handler、Looper、MessageQueue、Message)

Android與操作系統Windows一樣都是由消息驅動,而Android中實現消息驅動的要素由四點:

1、消息的格式:Message。消息結構體。包含next,next是一個Message實例,可以看出Message其實是一個鏈表。包含target成員,target是Handler實例。此外,它還包括了arg1,arg2,what,obj等參數,它們都是用於記錄消息的相關內容。

2、消息隊列:MessageQueue。消息隊列類,它包含了mMessages成員;mMessages是消息Message的實例。MessageQueue提供了next()方法來獲取消息隊列的下一則消息。

3、消息循環:Looper。消息循環類,負責從消息隊列取消息,然後通過handler轉發給UI線程,它包含mQueue成員變量,mQueue是一個消息隊列MessageQueue。

4、消息派發、處理:handler 

對應的java文件路徑--(android-5.1.0_r3\frameworks\base\core\java\android\os)

 

創建線程消息隊列

主線程消息隊列是在應用程序啓動時,由framework層自動創建。 

而如果開發者希望自己創建的子線程也擁有消息循環機制,則需開發者自己去創建。

handler.post()註釋:一般來說在工作線程中執行耗時任務,當任務完成時,會返回UI線程,一般是更新UI。這時有兩種方法可以達到目的。


一種是handler.sendMessage。發一個消息,再根據消息,執行相關任務代碼。
另一種是handler.post(r)。r是要執行的任務代碼。意思就是說r的代碼實際是在UI線程執行的。可以寫更新UI的代碼。(工作線程是不能更新UI的)

說再多不如上代碼:一個Handler的使用,並有handelr.post()主動創建線程

handler基類:

public class UIHandler<T> extends Handler{
         //WeakReference 爲弱引用方式,不瞭解的朋友自行百度
     protected WeakReference<T> ref;
 
     public UIHandler(T cla){
        ref = new WeakReference<T>(cla);
     }
     
      public T getRef(){
          return ref != null ? ref.get() : null;
      }
}

Handler 運用實例:

public class MainActivity extends Activity{
 
    private final MainHandler mHandler = new MainHandler(this);
 
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.oncreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//本文有對此方法的註釋,認真看的小朋友看到此處會明白
         //使用方法1,
         Message message=new Message();
        message.what=1;
        message.arg1=0;
        mHandler.sendMessage(message);
        //使用方法2
        myhandler.post(mRunnable);
    }
 
    private static final Runnable mRunnable = new Runnable(){
 
        @Override
         public void run(){
 
         }
    };
 
    private class MainHandler extends UIHandler{
         private MainHandler(MainActivity activity){
             super(activity);
         }
         
         @Override
         public void handleMessage(Message msg){
             super.handleMessage(msg);
             MainActivity activity = (MainActivity)ref.get();
             if(activity != null){
                if (activity.isFinishing()
                    return;
          switch(msg.what){
            case 1:
            break;
          }
             }
         }
    }
} 

看到了代碼的書寫方法,但是到了現在 可能對整個消息機制的流程還不是很清楚吧。那,我們上圖(圖片來自網絡借鑑,感謝【hnust_癲狂】共享)

 

本文借鑑:https://blog.csdn.net/tsdfk1455/article/details/61618317

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