【开源解码】EventBus简析

750 阅读2分钟

简介

  1. Android 事件发布/订阅框架
  2. 事件传递既可用于Android 四大组件间通讯
  3. EventBus的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。

使用

  • 1.定义事件event
  • 2.准备订阅者
  • 3.订阅者同时需要在总线上注册和注销自己
  • 4.发送事件,任何匹配该事件的接收者都能接收到事件

源码分析

注册EventBus.getDefault().register(this);

getDefault()方法

  • getDefault是一个单例方法,返回了EventBus对象实例
  • 对象构建:通过EventBusBuilder构建,三个核心Poster,用于线程调度
    • HandlerPoster
    • BackGroundPoster
    • AsyncPoster

subscribe注解/threadMode

  • 如下代码,运行时有效,描述方法
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    public @interface Subscribe {
        ThreadMode threadMode() default ThreadMode.POSTING;
    
        boolean sticky() default false;
    
        int priority() default 0;
    }
    
  • ThreadMode:5个枚举值
    • POSITING: 默认线程
    • MAIN: 主线程执行
    • MAIN_ORDERED:不同于MAIN,事件将一直排队等待发送。这确保了post调用是非阻塞的。
    • BACKGROUND: 后台线程执行
    • ASYNC: 订阅者将在单独的线程中被调用。这总是独立于发布线程和主线程
  • 粘性事件:事件消费者在事件发布之后才注册的也能接收到该事件的特殊类型
    • 如粘性广播,在广播发送结束后会保存刚刚发送的广播
    • AndroidEventBus 会存储所有的Sticky事件

register订阅

实质上就是找到订阅方法的合集

subscribe方法完成订阅

  1. 首先判断是否有注册过该事件
  2. 然后再按照优先级加入到subscriptionsByEventType的value的List中
  3. 然后再添加到typesBySubscriber的value的List中
  4. 分发事件:checkPostStickyEventToSubscription

post发送事件

  • checkPostStickyEventToSubscription -> postToSubscription(newSubscription, stickyEvent, isMainThread());
  • 根据线程不同做不同的发送操作