EventBus是一款针对Android优化的发布/订阅事件总线。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅,以及将发送者和接收者解耦。如果Activity和Activity进行交互还好说,如果Fragment和Fragment进行交互着实令人头疼,我们会使用广播来处理,但是使用广播稍显麻烦并且效率也不高,如果传递的数据是实体类需要序列化,那么很显然成本会有点高。
EventBus有三个主要的元素需要我们先了解一下:
EventBus3.0有以下四种ThreadMode:
3.使用:eventbus主要是分为普通事件和粘性事件,但总体步骤还是一致的:
使用第三方的一个重大步骤就是需要依赖,当然了这也得需要你的程序支持依赖的方式
compile'org.greenrobot:eventbus:3.0.0'
1.自定义一个事件类
public class MessageEvent {
...
}
2.在需要订阅事件的地方注册事件
EventBus.getDefault().register(this);
3.发送事件
EventBus.getDefault().post(messageEvent);
4.处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {
...
}
前面我们说过,消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING)。
而且我们一般取消订阅的时候都是在ondestory方法中你那个
5.取消事件订阅
EventBus.getDefault().unregister(this);
上面呢,是一个普通事件的使用,下面来简单介绍一下粘性事件:粘性事件的使用更加的灵活,亦可以在需要传值的地方发送消息
EventBus.getDefault().postSticky(new MessageEvent("粘性事件"));
只需要在接收的地方注册和取消订阅,接收就可以,而且发送和订阅之间的先后顺序没有要求,其他的使用和普通
事件是一样的。但是不要忘在订阅的时候,提供支持粘性事件
@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
publicvoidononMoonStickyEvent(MessageEvent messageEvent){
tv_message.setText(messageEvent.getMessage());
}
最后呢:说一下使用的感受,其实粘性和普通之间没有什么大的区别,就看你是如何使用的了,因为普通事件的订阅和
发送是在一起的,简单来说就是需要在失去焦点之后又重新获取焦点,而粘性事件没有要求,使用也比较灵活,但是呢
eventbus的使用需要一个事件类与之交互使用。