使用详解以及各版本的一些区别, 在了解版本区别之前先简单了解一下。
EventBus文档 http://greenrobot.org/eventbus/documentation
EventBus源码 https://github.com/greenrobot/EventBus
EventBus是什么?
EventBus是一种发布者和订阅者的事件分发模式。可以这么理解,比如我们订阅的Android Weekly,每当星期一0点这个时候,Android WeekLy公司,都会以邮件的形式通知我们。
目前有多个库都开发了这样的功能。它有以下的优点:
- 方法库较小
- 便于集成
- 使用简单
我们为什么要使用EventBus?
EventBus是彻底解耦的观察者模式。我们常常用在对象一对多的情况,使一个对象发生改变的时候,所有依赖的对象能够得到通知并更新。 比如我们在实际的开发中,当用户登录了,我们多个页面需要根据登录后的信息更改页面UI。这时,登录界面就是发布者,而其他的页面就是订阅者。它 们都在订阅用户信息变化的消息。 再比如我们的Fragment间的通信。
EventBus 1.0.5.1:
implementation 'org.simple:androideventbus:1.0.5.1'
复制代码
使用:
注意:官方是推荐将注册写到onStart,将注销写到onStop中,当然你也可以跟具自己的需求来改变的。
sticky 在注册期间,所有粘性订户方法将立即获得之前发布的粘性事件。
我在项目中碰到一个小问题就是我在A 界面发送一个粘性事件 在B 界面接受,如果 控件还未初始化完成,EventBus就已经注册了,那么在监听方法中的控件就未初始化,使用时也就为空。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
EventBus.getDefault().register(this);
initView();
}
复制代码
1.注册onCreate()中:
EventBus.getDefault().register(this);
复制代码
2.解除注册onDestroy方法:
EventBus.getDefault().unregister(this);
复制代码
3.监听(自定义方法即可,1.0是根据@Subscriber(tag=“resultData”)):
@Subscriber(tag = "resultData")
public void resultData(String data)
{
TextView.setText(data);
}
复制代码
4.发布事件 :
EventBus.getDefault().post(string,“resultData”);
复制代码
EventBus 2.4.1:
implementation'de.greenrobot:eventbus:2.4.1'
复制代码
使用:
1.注册onCreate()中:
EventBus.getDefault().register(this);
复制代码
2.解除注册onDestroy方法:
EventBus.getDefault().unregister(this);
复制代码
3.新建event类 :
public class MainEvent {
private String message;
public MainEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
复制代码
- 监听:
必须重写约定好的方法。
EventBus 在3.0.0版本以下的接收事件方法都是在约定好的方法进行接收。EventBus提供了以下几个方法进行接收事件:
onEvent() :执行在发送事件的线程。
onEventMainThread 代表这个方法会在UI线程执行。
onEventPostThread :代表这个方法会在当前发布事件的线程执行。
onEventBackgroundThread :事件处理是在后台线程,但事件处理时间还是不应该太长, 因为如果发送事件的线程是后台线程,会直接执行事件, 如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件, 如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。
onEventAsync :每个事件会开启一个线程(有线程池),但最好限制线程的数目 。
public void onEvent(MainEvent event) {
if (TextUtils.isEmpty(event.getName()))
return;
Toast.makeText(this, event.getName(), Toast.LENGTH_SHORT).show();
}
复制代码
- 发布事件:
EventBus.getDefault().post(new MainEvent("Hello everyone"));
复制代码
EventBus 3.1.1:
implementation 'org.greenrobot:eventbus:3.1.1'
复制代码
使用:
- 注册onCreate()中:
EventBus.getDefault().register(this);
复制代码
- 解除注册onDestroy方法:
EventBus.getDefault().unregister(this);
复制代码
-
新建event类 :
-
监听:
threadMode指线程模式, priority指事件的优先级, sticky是否为粘性事件
threadMode 就是旧版本接收信息运行的方法:
- NAIN UI主线程
- BACKGROUND 后台线程
- POSTING 和发布者处在同一个线程(默认)
- ASYNC 异步线程
priority 其实和Boardcast接收者的优先级差不多,数越大优先级越高,一般0-100。默认为0
sticky 在注册期间,所有粘性订户方法将立即获得之前发布的粘性事件
@Subscribe
public void getEventBus(RegisterEvent event){
(...)
}
@Subscribe(threadMode = ThreadMode.POSTING, priority = 2, sticky = true)
public void getEventBus(RegisterEvent event){
(...)
}
复制代码
- 发布事件:
//发布普通事件
EventBus.getDefault().post(new RegisterEvent());
//发布粘性事件
EventBus.getDefault().postSticky(new RegisterEvent());
复制代码
- 移除粘性事件:
//移除粘性事件
EventBus.getDefault().removeStickyEvent(new RegisterEvent());
//移除所有粘性事件
EventBus.getDefault().removeAllStickyEvents();
复制代码
EventBus优缺点:
优点:插件大小合适,仅54K ,
简化组件之间的通信方式,实现解耦让业务代码更加简洁,可以动态设置事件处理线程以及优先级
缺点:每个事件都必须自定义一个事件类,造成事件类太多,无形中加大了维护成本
EventBus 3.1.1与2.4.1的区别 :
代码更加简洁: EventBus 2.4.1 必须定义以onEvent开头的几个方法,代码中语境比较突兀,且有可能会导致拼写错误
EventBus 3.1.1 函数名字不再受到权限,而且可以在一个函数中体现出在哪个线程执行,并且可指定接收事件的优先级。
性能 :
EventBus 2采用反射的方式对整个注册的类的所有方法进行扫描来完成注册,会有性能上的影响。
EventBus 3中EventBus提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,然后生成java类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快。