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的基本使用邏輯如下:
-
定義事件型別
public static class MessageEvent { /* Additional fields if needed */ }
-
通過@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。
-
註冊和取消註冊包含訂閱方法的訂閱者
比如在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 */};
-
釋出事件
EventBus.getDefault().post(new MessageEvent());
通過上文,我們知道eventbus的基本使用流程主要有四個步驟,而其中涉及eventbus的主要有三個方法,分別為register註冊訂閱者,unregister取消註冊,post釋出事件。後續我將分別以這三個方法為入口,對eventbus原始碼進行解析,敬請期待。