EventBus :针对Android优化的发布/订阅事件总线,简化应用程序内各组件间、组件与后台线程间的通信。
优点:开销小,代码又简洁优雅,将发送者和接受者解耦。
eventbus三要素
1.event:事件,可以是任意类型的对象
2.Subscriber:事件订阅者,eventbus3.0之前消息处理的方法只限定于onEvent()/onEventMainThread()/onEventBackgroundThread()和onEventAsync()四种线程模型。3.0之后事件处理的方法可以随便取名,但是需要添加注解@Subsceribe,和指定线程模型(默认posting)
3.publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用eventbus的post(object)方法。可自己实例化eventbus对象,一般使用eventbus。getDefault()就可,根据post函数参数的类型,会自动调用订阅相应类型事件的函数
eventbus的四种线程模型
1.posting(默认):若使用事件处理函数指定了线程模型,那么该事件在哪个线程发布出来的,时间梳理函数就会在那个线程中运行。也就是说发布事件和接收事件在同一个线程,在该线程的事件处理函数中尽量避免执行耗时操作,因为它会阻塞时间的传递,甚至可能引起ANR
2.MAIN:事件的处理会在UI线程中执行,事件处理的时间不能太长,否则会ANR
3.BACKGROUND:事件的处理会在UI线程中发布出来,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程发布出来的,那么该事件处理函数直接在发布事件的线程中执行。此事件处理函数中禁止进行UI更新操作
4.async:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样的,此事件处理函数禁止进行UI更新操作
使用流程
1.自定义一个事件类
public class UserData {
private String name;
private String message;
//getter setter
}
2.在需要订阅事件的地方注册事件
EventBus.getDefault().register(this);
3.发送事件
UserData data = new UserData();
data.setName("老子王");
data.setMessage("今天中了一等奖");
EventBus.getDefault().post(data);
4.处理事件
/**
*sticky 如果为true,则发送最近的粘性事件
*priority 订阅者优先级,影响事件传递的顺序,越大优先级越高
**/
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 1)
public void eventBus(UserBean userBean){
//todo 发送事件传递来的消息,想干啥干啥
}
5.取消事件订阅
EventBus.getDefault().unregister(this);
粘性事件
使用postSticky()发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。