EventBus的使用
EventBus是基于观察者模式,有两种角色,一种是事件订阅者,一种是事件的发布者,EventBus的作用就是事件的搬运工,把事件从发布者传递给事件的订阅者。
1、添加依赖
implementation 'org.greenrobot:eventbus:3.1.1'
2、创建事件
public class eventBusEvent1 {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
3、注册和反注册
如果在Activity中注册和反注册,可以在onCreate()或者onStart()中注册,在onStop()或者onDestroy()中反注册。
在Fragment中,可以在onCreate()中注册,在onDestory()中反注册,也可以在onCreateView()中注册,在onDestroyView()中反注册。
在自定义的控件中,可以在onAttachedToWindow中注册,在onDetachedFromWindow中反注册。
注册:
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
反注册:
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
4、订阅事件和线程模式
注册完成之后,就可以声明订阅事件的方法了,方法必须是public的,并且用@Subcribe来修饰,参数为想要订阅的事件,在声明中可以指定线程模式(threadMode),线程模式可以配置订阅方法在哪个线程中执行。如果不适用threadMode来指定,默认线程模型为POSTING。
(1)POSTING线程模型:在哪个线程发布事件,就在哪个线程执行onPostingEvent方法。
@Subscribe(threadMode = ThreadMode.POSTING)
public void setTv_show(eventBusEvent1 eventBusEvent1){
tv_show.setText(eventBusEvent1.getStr());
}
(2)MAIN线程模型:不管是哪个线程发布事件,都在主线程执行onMainEvent方法。
@Subscribe(threadMode = ThreadMode.MAIN)
public void setTv_show(eventBusEvent1 eventBusEvent1){
tv_show.setText(eventBusEvent1.getStr());
}
(3)BACKGROUND线程模型:时间如果在子线程发布,onBackgroundEvent方法就在该子线程执行,事件如果在主线程中发布,onBackGroundEvent方法就在EventBus内部的线程池中执行。
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void setTv_show(eventBusEvent1 eventBusEvent1){
tv_show.setText(eventBusEvent1.getStr());
}
(4)ASYNC线程模型:不管事件是在哪个线程发布,onAsyncEvent方法都在EventBus内部的线程池中执行
@Subscribe(threadMode = ThreadMode.ASYNC)
public void setTv_show(eventBusEvent1 eventBusEvent1){
tv_show.setText(eventBusEvent1.getStr());
}
5、发布事件
创建一个事件,调用post方法进行发布,所有的订阅该事件的方法都会被触发调用。
eventBusEvent2 eventBusEvent2 = new eventBusEvent2();
eventBusEvent2.setI(i);
EventBus.getDefault().post(eventBusEvent2);
6、事件优先级
当一个事件同时有几个方法订阅,并且在同一个线程模式下,可以通过配置优先级来指定它们调用的先后顺序。优先级priority默认为0,数值越大,执行的顺序越靠前。
@Subscribe(priority = 1)
public void setTv_show(eventBusEvent1 eventBusEvent1){
tv_show.setText(eventBusEvent1.getStr());
}
7、粘性事件
就是把事件提前发送出来,当某个类注册EventBus并且有该事件的订阅方法,就能马上被调用,这相当于EventBus做了缓存,和事件的优先级一样,使用的频率较少。
eventBusEvent1.setStr("这里是service发布的数据: "+i);
EventBus.getDefault().postSticky(eventBusEvent1);
@Subscribe(sticky = true,threadMode = ThreadMode.MAIN)
public void setTv_show(eventBusEvent1 eventBusEvent1){
tv_show.setText(eventBusEvent1.getStr());
}
EventBus的基本使用就是这么简单,他的效率比通过广播或者加接口等的形式更加高。但是缺点是需要注册和反注册,有时候忘记反注册容易引起内存泄漏,而且,需要创建一个新的类。