简介
- Android 事件发布/订阅框架
- 事件传递既可用于Android 四大组件间通讯
- 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方法完成订阅
- 首先判断是否有注册过该事件
- 然后再按照优先级加入到subscriptionsByEventType的value的List中
- 然后再添加到typesBySubscriber的value的List中
- 分发事件:checkPostStickyEventToSubscription
post发送事件
- checkPostStickyEventToSubscription -> postToSubscription(newSubscription, stickyEvent, isMainThread());
- 根据线程不同做不同的发送操作