您的位置:首页 > 移动开发 > Android开发

EventBus 3.0 使用用例

2016-09-10 18:34 162 查看
   EventBus 已经进入 3.0时代,以前一直使用2的版本。今天测试了一下3.0使用流程,以后再看一下源码。一直很喜欢EventBus的事件分发处理。

   EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递。传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。

   事件(Event):又可称为消息。其实就是一个对象,可以是网络请求返回的字符串,也可以是某个开关状态等等。事件类型(EventType)指事件所属的 Class。事件分为一般事件和 Sticky 事件,相对于一般事件,Sticky 事件不同之处在于,当事件发布后,再有订阅者开始订阅该类型事件,依然能收到该类型事件最近一个 Sticky 事件。

   订阅者(Subscriber):订阅某种事件类型的对象。当有发布者发布这类事件后,EventBus 会执行订阅者的 onEvent 函数,这个函数叫事件响应函数。订阅者通过 register 接口订阅某个事件类型,unregister 接口退订。订阅者存在优先级,优先级高的订阅者可以取消事件继续向优先级低的订阅者分发,默认所有订阅者优先级都为 0。

   发布者(Publisher):发布某事件的对象,通过 post 接口发布事件。

EventBus 3.0 下载

在build.gradle中添加如下:

  compile 'org.greenrobot:eventbus:3.0.0'

EventBus 使用范围非常广泛,不管是Activity,Fragment,Service,Broadcast 还是自定义布局,只要进行注册,就能进行事件接收处理。

代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

EventBus.getDefault().register(this);

}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}


EventBus.getDefault().register(this); 是进行注册

EventBus.getDefault().unregister(this); 是对注册进行注销

如果在onDestory() 中不进行注销,只要Application 存在, 该Activity 就相当于进行了多次注册,当接收事件事就会出现多余时间,从而造成一些逻辑上的错误。我记得以前处理一个数,接收到就让那个数相加,在Ondestory没有销毁,一次又一次的注册,最后就造成 运行结果和预期不一致。

订阅:

在3.0版本钱,EventBus 接收时间定义了几个方法。3.0版本我测得只要进行@Subscribe, EventBus 这个方法名称可以自己定义

@Subscribe
public void EventBus(String message){
 // TODO: xxxx  
}


我写了一个事件分发中心:

public class EventCenter {

public Object value;

public  String opreatId;

public EventCenter( String opreatId,Object value) {
this.value = value;
this.opreatId = opreatId;
}

}



发布者:

即一个业务处理完把业务事件进行分发

EventBus.getDefault().post(xxx);


如:定义了一个 UserModel

public class UserModel {

public String nickname;

}

如果哪几个Activity 或者Fragment 需要接收这个事件。过程就是 需要接收的进行注册。

事件处理

@Subscribe

public void EventBus(Object message){

   // TODO: xxxx  

 //  (UserModel)message.value)   这样就可以获得UserModel

}

事件发送:

UserModel user = new UserModel();

user.name ="xxx";

  EventBus.getDefault().post(new EventCenter("UserModel",user));

如果事件非常多的时候,opreatId 就起到作用了,通过 opreatId  进行事件过滤,哪些需要接收,哪些是 要处理的相应事件,这样就比较明确了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EventBus android 框架