功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替[Android]传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。
特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。
EventBus的简单实现
第一步:添加依赖,在build.gradle中的dependencies{}
implementation 'org.greenrobot:eventbus:3.1.1'
第二步:定义消息事件类
public class MessageEvent{
private String message;
public MessageEvent(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
第三步:注册和解除注册
在接收传递消息的Activity类里面的onCreate()方法和onDestory()方法里,进行注册EventBus和解除注册。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(XXX);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
第四步:接受事件
在接受消息的Activity类里面写对于事件的处理
在3.0版本中.通过@Subscribe注解,来确定运行的线程threadMode(默认是POSTING),是否接受粘性事件sticky以及事件优先级priority,priority值越大,越先收到事件或消息。
@Subscribe
public void onMessageEventMain(MessageEvent event) {
Toast.makeText(this,event.getMessage()),Toast.LENGTH_SHORT).show();
}
第五步:发送事件
在发送消息的Activity类里面写,最好将发送事件的动作写到onStop()里面
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().post(new MessageEvent("XXXX"));
}
粘性事件
之前说的使用方法,都是需要先注册(register),再post,才能接受到事件;如果你使用postSticky发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。
普通的事件我们通过post发送给EventBus,发送过后之后当前已经订阅过的方法可以收到。但是如果有些事件需要所有订阅了该事件的方法都能执行呢?例如一个Activity,
要求它管理的所有Fragment都能执行某一个事件,但是当前我只初始化了3个Fragment,如果这时候通过post发送了事件,那么当前的3个Fragment当然能收到。但是这个时候
又初始化了2个Fragment,那么我必须重新发送事件,这两个Fragment才能执行到订阅方法。
粘性事件就是为了解决这个问题,通过 postSticky 发送粘性事件,这个事件不会只被消费一次就消失,而是一直存在系统中,知道被 removeStickyEvent 删除掉。那么只要订阅了
该粘性事件的所有方法,只要被register 的时候,就会被检测到,并且执行。订阅的方法需要添加 sticky = true 属性。
发布消息:
EventBus.getDefault().postSticky(new StickyEvent("我是粘性事件"));
接收消息:和之前的方法一样,只是多了一个 sticky = true 的属性。
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(StickyEvent event){
tv_c_result.setText(event.msg);
}
注册:
EventBus.getDefault().register(CActivity.this);
解注册:
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(CActivity.class);
网友评论