EventBus3.0源码解析-01

最近在学习EventBus源码,本着学习完之后要及时总结,方便以后回顾的心态,这里做一个系列来分析EventBus的源码。本系列讨论的都是最新的EventBus3.0的源码。EventBus GitHub地址

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

1
implementation 'org.greenrobot:eventbus:3.1.1'

EventBus的基本流程

基本流程

从官网流程图可以看出,EventBus使用的是观察者模式,Publisher(发布者)调用post方法将事件发送给订阅了该事件的Subscriber(订阅者)。

  • Publisher(发布者)—调用post方法发布事件的类就是发布者
  • Subscriber(订阅者)—通过@Subscribe注解的方法就是订阅者
  • EventBus—负责把post方法发布的事件通知给相应的订阅者

EventBus的基本使用逻辑如下:

  1. 定义事件类型

    1
    public static class MessageEvent { /* Additional fields if needed */ }
  2. 通过@Subscriber准备订阅方法

    1
    2
    @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。

  3. 注册和取消注册包含订阅方法的订阅者

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @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 */};
  4. 发布事件

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

通过上文,我们知道eventbus的基本使用流程主要有四个步骤,而其中涉及eventbus的主要有三个方法,分别为register注册订阅者,unregister取消注册,post发布事件。后续我将分别以这三个方法为入口,对eventbus源码进行解析,敬请期待。

文章目录
  1. 1. EventBus的基本流程
|