最近在学习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事件除外,sticky事件是通过反射先被找到的订阅方法先被通知;
-
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源码进行解析,敬请期待。