EventBus3.0源码解析-01

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiayong1/article/details/86095858

最近在学习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源码进行解析,敬请期待。

猜你喜欢

转载自blog.csdn.net/xiayong1/article/details/86095858
今日推荐