EventBus介绍
EventBus是一款针对android优化的发布-订阅事件总线。它简化了应用程序内各组件间、组件与后台线程间的通信。
优点:开销小,代码更优雅,将发送者和接受者解耦。
总体结构
使用EventBus
EventBus三要素:
- Event:事件。可以使任意类型对象。
- Subscriber:事件订阅者。在EventBus3.0之后,事件处理的方法可以随便取名,但需要添加一个注解@Subscribe,并且要指定线程模型(默认POSTING)。
- Publisher:事件发布者。可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法。
4种线程模型:
- POSTING(默认):发布事件和接收事件在同一个线程中,该模式下事件处理函数中尽量避免执行耗时操作,因为他会阻塞事件的传递,甚至可能引起ANR。
- MAIN:事件的处理会在UI线程执行。
- BACKGROUND:如果事件发布在UI线程,那么事件处理在新的线程执行;如果事件发布本来就在子线程,那么事件处理就直接在发布事件的线程中执行。在此事件处理函数禁止进行更新UI操作。
- ASYNC:无论事件在那个线程发布,该事件处理函数都会在新建的子线程中执行,同样,在此事件处理函数禁止进行更新UI操作。
EventBus基本用法
分为5个步骤:
(1)定义一个事件类
public class MessageEvent {
...
}
(2)在需要订阅事件的地方注册事件
不能重复注册
EventBus.getDefault().register(this);
(3)发送事件
EventBus.getDefault().post(messageEvent);
(4)处理事件
必须是public,非静态,非抽象的,参数只能有一个。
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {
...
}
(5)取消订阅事件
EventBus.getDefault().unregister(this);
EventBus源码分析
EventBus类图
注册流程
事件发布流程