1. 程式人生 > >EventBus3.0原始碼解析-01

EventBus3.0原始碼解析-01

最近在學習EventBus原始碼,本著學習完之後要及時總結,方便以後回顧的心態,這裡做一個系列來分析EventBus的原始碼。本系列討論的都是最新的EventBus3.0的原始碼。EventBus GitHub地址

EventBus在gradle工程中引入的方式如下:

implementation 'org.greenrobot:eventbus:3.1.1'

EventBus的基本流程

在這裡插入圖片描述

從官網流程圖可以看出,EventBus使用的是觀察者模式,Publisher(釋出者)呼叫post方法將事件傳送給訂閱了該事件的Subscriber(訂閱者)。

  • Publisher(釋出者)—呼叫post方法釋出事件的類就是釋出者
  • Subscriber(訂閱者)—通過@Subscribe註解的方法就是訂閱者
  • EventBus—負責把post方法釋出的事件通知給相應的訂閱者

EventBus的基本使用邏輯如下:

  1. 定義事件型別

    public static class MessageEvent { /* Additional fields if needed */ }
    
  2. 通過@Subscriber準備訂閱方法

    @Subscribe(threadMode = ThreadMode.MAIN)  
    public void onMessageEvent(MessageEvent event) {/* Do something */};
    

    其中@Subscriber可以指定三個引數:

  • ThreadMode—指定訂閱方法(上文中的onMessageEvent方法)執行在什麼執行緒,預設是POSTING;
    POSTING:表示訂閱方法執行在當前釋出事件的執行緒(呼叫post方法的執行緒);

    MAIN:表示訂閱方法執行在UI執行緒。如果當前釋出事件的執行緒是UI執行緒,則訂閱方法直接執行,否則,事件入佇列等待觸發訂閱方法(入佇列的方式不阻塞執行緒);

    MAIN_ORDERED:表示訂閱方法執行在UI執行緒。它和MAIN的區別是,事件會直接入佇列等待觸發訂閱方法;

    BACKGROUND:表示訂閱方法執行在後臺執行緒。如果當前釋出事件的執行緒是後臺執行緒,則訂閱方法直接執行,否則,訂閱方法將會執行在一個唯一的後臺執行緒中,該唯一的後臺執行緒將會負責執行所有有BACKGROUND標識的訂閱方法;

    ASYNC:表示訂閱方法將總是執行在一個新的後臺執行緒,即即使當前釋出事件的執行緒是後臺執行緒,它也會執行在一個新的後臺執行緒。

  • priority—表示該方法的優先順序,預設是0。當釋出事件的時候,同一執行緒中,優先順序值越大的方法,會被更早呼叫;

  • sticky—如果為true,將會發送最新的sticky事件給相應的訂閱者,預設為false;
    sticky的使用一般為:如果使用者希望先呼叫postSticky釋出事件,再註冊訂閱者接收該事件,則可以指定sticky為true。

  1. 註冊和取消註冊包含訂閱方法的訂閱者

    比如在Activity中,方式一般如下:

    @Override
     public void onStart() {
         super.onStart();
         EventBus.getDefault().register(this);
     }
    
     @Override
     public void onStop() {
         super.onStop();
         EventBus.getDefault().unregister(this);
     }
     
     // 訂閱方法
     @Subscribe(threadMode = ThreadMode.MAIN)  
     public void onMessageEvent(MessageEvent event) {/* Do something */};
    
  2. 釋出事件

    EventBus.getDefault().post(new MessageEvent());
    

通過上文,我們知道eventbus的基本使用流程主要有四個步驟,而其中涉及eventbus的主要有三個方法,分別為register註冊訂閱者,unregister取消註冊,post釋出事件。後續我將分別以這三個方法為入口,對eventbus原始碼進行解析,敬請期待。