前言
首先我们来说下事件总线,它的作用:为了更简化并更高质量的在Activity,Fragment,Thread和Service等之间的通信,解决组件之间高耦合的同时仍能进行高效的通信。
什么是EventBus
EventBus 是一款针对Android优化的发布-订阅事件总线,简化了应用程序中的各个组件与后台线程间的通信。
其优点是开销小,代码更优雅,将发送者和接收者解耦。
EventBus的使用
EventBus三要素
- Event:事件。(任意类型)
- Subscriber:事件订阅者。在EventBus3.0之前仅限定于4种线程模型(onEvent,onEventMainThread,onEventBackgroundThread和onEventAysnc)。而在EventBus3.0之后,事件处理方法任意命名,但必须添加一个注解@Subscribe,并指定线程模型(默认为POSTING)。
- Publisher:事件发布者。调用EventBus的post(Object)。根据post参数类型,自动调用相应事件的函数。
EventBus4种ThreadMode(线程模型)
- POSTING(默认):发布事件和接收事件在同一个线程。在使用该线程模型事件处理函数中尽量避免执行耗时操作,会导致线程阻塞,甚至引发ANR异常。
- MAIN:处理事件在UI线程执行。事件处理的事件不能太长,太长会导致ANR。
- BACKGROUND:如果事件在UI线程发布,则该事件函数处理在新的线程中运行;如果事件在子线程发布,则事件函数处理直接在发布线程中运行。此事件处理函数禁止更行UI操作。
- ASYNC:无论事件在哪个线程发布,该事件函数处理都会在新建的子线程中执行。同样,该事件处理函数禁止更行UI操作。
EventBus的基本用法
(1) 自定义一个事件类
public class MessageEvent{
...
}
(2)在需要订阅该事件的地方注册事件
EventBus.getDefault().register(this);
(3)发送事件
EventBus.getDefault().post(messageEvent);
(4)处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent){
...
}
(5)取消注册事件
EventBus.getDefault().unregister(this);