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 还是自定义布局,只要进行注册,就能进行事件接收处理。
代码如下:
EventBus.getDefault().register(this); 是进行注册
EventBus.getDefault().unregister(this); 是对注册进行注销
如果在onDestory() 中不进行注销,只要Application 存在, 该Activity 就相当于进行了多次注册,当接收事件事就会出现多余时间,从而造成一些逻辑上的错误。我记得以前处理一个数,接收到就让那个数相加,在Ondestory没有销毁,一次又一次的注册,最后就造成 运行结果和预期不一致。
订阅:
在3.0版本钱,EventBus 接收时间定义了几个方法。3.0版本我测得只要进行@Subscribe, EventBus 这个方法名称可以自己定义
我写了一个事件分发中心:
即一个业务处理完把业务事件进行分发
如:定义了一个 UserModel
如果哪几个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 事件发布/订阅框架,通过解耦发布者和订阅者简化 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 进行事件过滤,哪些需要接收,哪些是 要处理的相应事件,这样就比较明确了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories