EventBus是一款针对Android定制的[发布/订阅]事件总线。它让我们轻松的处理四大组件之间的事件传递,而且速度更快,整个包的体积也较小(只有不到50K的的大小)。
本博文将对EventBus的使用和进行解析。
PS:本文基于EventBus 3.0版本进行解析。
1. EventBus是什么?
官网给出的解释:EventBus是针对Android定制的[发布/订阅]事件总线。
下图是对其的一个简单概述:
EventBus-Publish-Subscribe.png
2. 如何使用(3步)
只需要简单的三个步骤,我们便可轻松在项目中使用EventBus,下面描述如何在我们的项目中使用它。
- 定义事件
public static class MessageEvent { /* Additional fields if needed */ }
- 准备订阅者
- 声明接收事件的注解方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
- 订阅或取消订阅(以Activity为例)
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
- 发布事件
EventBus.getDefault().post(new MessageEvent());
3. 使用要点分析
在注册接收事件的方法时,使用@Subscribe注解时我们需要提供一个threadMode的参数,那么下面我们首先来分析下Subscribe注解的使用。
- Subscribe的定义
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
/**
* If true, delivers the most recent sticky event (posted with
* {@link EventBus#postSticky(Object)}) to this subscriber (if event available).
*/
boolean sticky() default false;
/** Subscriber priority to influence the order of event delivery.
* Within the same delivery thread ({@link ThreadMode}), higher priority subscribers will receive events before
* others with a lower priority. The default priority is 0. Note: the priority does *NOT* affect the order of
* delivery among subscribers with different {@link ThreadMode}s! */
int priority() default 0;
}
在使用注解时我们可以提供以下参数:
* threadMode(线程运行模式)
* sticky(是否接收的是粘性事件)
* priority(接收事件的优先级)
ThreadMode
ThreadMode是一个枚举,有以下值提供:
- POSTING
- MAIN
- BACKGROUND
- ASYNC
- POSTING
- 发布事件和订阅事件运行在同一个线程,这也是默认值。
- 此时事件分发传递开销较小,因为它避免了完全线程切换。
- 这是不需要主线程简单任务的推荐模式。
- 使用此模式的事件处理程序必须快速返回,以避免阻塞发布线程,因为这可能是主线程。
- MAIN
- 订阅者将在Android主线程中被调用。
- 如果发布者是在主线程中发布事件,那么事件处理方法将被直接调用。
- 事件处理方法必须快速返回,防止阻塞主线程。
- BACKGROUND
- 订阅者将在后台线程中被调用。
- 如果发布者线程不是主线程,事件处理方法将直接在发布者线程中调用。
- 如果发布者线程是主线程,EventBus使用一个单独的后台线程,它将顺序地提供其所有的事件。
- 使用此模式的事件处理方法应该尝试快速返回,防止阻塞后台线程。
- ASYNC
- 订阅者总是在一个单独的线程中被调用。这个线程独立于主线程和发布线程。
- 如果事件的处理为耗时操作,那么推荐使用该模式。
- 注意限制并发数量。
- EventBus使用线程池来解决线程重用问题。
4. 黏性事件
- 如何使用
//注册事件接收方法
@Subscribe(sticky = true)
public void XXX(MessageEvent messageEvent) {
......
}
//发送黏性事件
EventBus.getDefault().postSticky(new MessageEvent("test"));
- 区别
那么黏性事件与普通事件有什么区别呢?
- 事件订阅者可接收注册前发布的黏性事件(如果存在多个,那么只能接收最近的那一个)
其他的使用和非黏性事件相同,在此不做描述。