EventBus 3.0 使用方法以及使用过程中遇到的一些问题
嗯~本人为Android萌新程序猿一枚
这是我在博客写的第一篇文章,怀着忐忑的心情终于落笔了
各位来自天南海北的再生父母们,喜欢的话可以加个关注,点个赞(能打赏的话那真的是给您磕头了),谢谢铁汁🚪
好了,废话不多说,直接开冲
EventBus简介
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
使用方法
第一步当然是添加依赖啦:
好了,准备工作完毕,接下来进行下一步的封装(没错,我就是封装狂魔)
相信大家在做Android app的时候都有一个自己写的继承了AppCompatActivity的基础activity(我这里叫BaseActivity),在BaseActivity里我们可以编写我们需要的常用抽象方法,然后在以后的子activity里面就可以重写这些抽象类啦,我在BaseActivity里面对EventBus事件的分发进行了封装
然后在onCreate和onDestory里面分别对EventBus进行注册(register)和注销(unregister)
准备工作终于做完了,接下来就是非常非常简单的使用了!(多图预警)
点击发送按钮,将数据传回上一个界面
在中间的文本框内接收并显示传回的数据
粘性事件是指:发布者发送事件的动作发生在订阅者订阅该事件的动作之前,订阅者在订阅之后,仍然可以处理该事件。
我个人理解粘性事件和普通事件就是:要是你数据传输的时候,你要接收数据的那个页面不存在,那么就用postSticky;要是你进行数据传输的时候,接收数据的页面存在了,那么就是普通事件,用post即可;
没错,就是这么肤浅!(理直气壮)
这边我也粘一段有关粘性事件传输的代码,关键来了
⚠️ 注意:粘性事件在接收的时候一定要加 sticky = true ,在事件接收之后,一定要removeSticky!!!
我是分割线
小结:
1.接收数据的页面不存在的话就用postSticky(粘性事件),存在就用post(普通事件)
2.粘性事件在接收处理数据之前记得加sticky = true ,事件完成之后一定要removeSticky
3.使用EventBus之前一定记得注册,完成之后一定记得注销,这是重中之重!!!(要是你代码写完之后,程序跑起来了,结果数据死活就是拿不到,也没报错,那么,十有八九,就是你没用注册~)
不知不觉又到了该说再见的时候(手动狗头🐶),怀着忐忑的心情写下这些结束语(手动狗头🐶),作为一个Android开发还没入门的程序员来说,我写下这篇博文的初心是为了警告自己, EventBus使用的时候,要是没拿到数据,一定要先检查是否注册,我真的被这个坑了好多次了(太傻逼了)。写这篇文章也是为了大家能够更方便的使用EventBus,同时也警告大家一定要记得注册🐶
话不多说,要是我什么地方写的有问题,请大家一定要给我指出,我会努力思考并改正的,毕竟咱只是一个平平无奇的Android小废柴,还请大家多多关照,多多指教
好了,下期我会给铁汁们整一个有关BackgroundLibrary类库(通过标签直接生成shape,无需再写shape.xml)的使用方法,再见~
嗯~本人为Android萌新程序猿一枚
这是我在博客写的第一篇文章,怀着忐忑的心情终于落笔了
各位来自天南海北的再生父母们,喜欢的话可以加个关注,点个赞(能打赏的话那真的是给您磕头了),谢谢铁汁🚪
好了,废话不多说,直接开冲
EventBus简介
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
使用方法
第一步当然是添加依赖啦:
api 'org.greenrobot:eventbus:3.1.1'
添加完依赖之后就可以直接使用啦,但是为了方便使用,我对eventbus数据传输的几个重要方法进行了封装
public class EventBusUtils {
private EventBusUtils() {
}
/**
* 注册 EventBus
*
* @param subscriber
*/
public static void register(Object subscriber) {
EventBus eventBus = EventBus.getDefault();
if (!eventBus.isRegistered(subscriber)) {
eventBus.register(subscriber);
}
}
/**
* 解除注册 EventBus
*
* @param subscriber
*/
public static void unregister(Object subscriber) {
EventBus eventBus = EventBus.getDefault();
if (eventBus.isRegistered(subscriber)) {
eventBus.unregister(subscriber);
}
}
/**
* 发送事件消息
*
* @param event
*/
public static void post(EventMessage event) {
EventBus.getDefault().post(event);
}
/**
* 发送粘性事件消息
*
* @param event
*/
public static void postSticky(EventMessage event) {
EventBus.getDefault().postSticky(event);
}
/**
* 销毁粘性事件
* @param event
*/
public static void removeSticky(EventMessage event) {
EventBus.getDefault().removeStickyEvent(event);
}
}
相对应的,EventMessage则是我对post对象的封装
public class EventMessage<T> {
private int code;
private T data;
public EventMessage(int code) {
this.code = code;
}
public EventMessage(int code, T data) {
this.code = code;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "EventMessage{" +
"code=" + code +
", data=" + data +
'}';
}
}
因为我在进行数据传输的时候,是根据code去判断到底是哪个事件的,所以我这里对各种事件相对应的code也进行了统一的处理,形成了一个常量池EventCode
public class EventCode {
public static final int SUCCESS = 0x000001;// 成功
public static final int ERROR = 0x000002; // 失败
public static final int COMPLETE = 0x000003; // 完成
}
好了,准备工作完毕,接下来进行下一步的封装(没错,我就是封装狂魔)
相信大家在做Android app的时候都有一个自己写的继承了AppCompatActivity的基础activity(我这里叫BaseActivity),在BaseActivity里我们可以编写我们需要的常用抽象方法,然后在以后的子activity里面就可以重写这些抽象类啦,我在BaseActivity里面对EventBus事件的分发进行了封装
/**
* 是否注册事件分发
*
* @return true 注册;false 不注册,默认不注册
*/
protected boolean isRegisteredEventBus() {
return false;
}
然后在onCreate和onDestory里面分别对EventBus进行注册(register)和注销(unregister)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// EventBus事件注册
if (isRegisteredEventBus()) {
EventBusUtils.register(this);
}
}
@Override
public void onDestroy() {
super.onDestroy();
// EventBus事件注销
if (isRegisteredEventBus()) {
EventBusUtils.unregister(this);
}
}
准备工作终于做完了,接下来就是非常非常简单的使用了!(多图预警)
点击发送按钮,将数据传回上一个界面
EventBusUtils.post(new EventMessage(EventCode.SUCCESS, "老八秘制小憨包"));
在中间的文本框内接收并显示传回的数据
/**
* 在这个页面对EventBus进行注册
*
* @return
*/
@Override
protected boolean isRegisteredEventBus() {
return true;
}
/**
* 接收数据
*
* message.getCode()就是事件对应的标识
* message.getData()就是传回的数据信息
*
* @param message
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventBusMessage(EventMessage message) {
switch (message.getCode()) {
case EventCode.SUCCESS:
tvReceiveMessage.setText(message.getData().toString());
break;
}
}
上面是对于非粘性事件的处理,好了,一定有小伙伴要问了,什么叫粘性事件,什么叫非粘性事件(普通事件),我这边粘一段比较官方的说法:
粘性事件是指:发布者发送事件的动作发生在订阅者订阅该事件的动作之前,订阅者在订阅之后,仍然可以处理该事件。
我个人理解粘性事件和普通事件就是:要是你数据传输的时候,你要接收数据的那个页面不存在,那么就用postSticky;要是你进行数据传输的时候,接收数据的页面存在了,那么就是普通事件,用post即可;
没错,就是这么肤浅!(理直气壮)
这边我也粘一段有关粘性事件传输的代码,关键来了
⚠️ 注意:粘性事件在接收的时候一定要加 sticky = true ,在事件接收之后,一定要removeSticky!!!
EventBusUtils.postSticky(new EventMessage(EventCode.ERROR, "老七蜜汁小憨包"));
/**
* EventBus事件注册
* @return
*/
@Override
protected boolean isRegisteredEventBus() {
return true;
}
/**
* sticky = true 粘性事件,一定不要忘记
* removeSticky,移除数据,重中之重
*
* @param message
*/
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void eventBus(EventMessage message) {
switch (message.getCode()) {
case EventCode.ERROR:
tvReceiveMessage.setText(message.getData().toString());
// 一定要记得remove
EventBusUtils.removeSticky(message);
break;
}
}
我是分割线
小结:
1.接收数据的页面不存在的话就用postSticky(粘性事件),存在就用post(普通事件)
2.粘性事件在接收处理数据之前记得加sticky = true ,事件完成之后一定要removeSticky
3.使用EventBus之前一定记得注册,完成之后一定记得注销,这是重中之重!!!(要是你代码写完之后,程序跑起来了,结果数据死活就是拿不到,也没报错,那么,十有八九,就是你没用注册~)
不知不觉又到了该说再见的时候(手动狗头🐶),怀着忐忑的心情写下这些结束语(手动狗头🐶),作为一个Android开发还没入门的程序员来说,我写下这篇博文的初心是为了警告自己, EventBus使用的时候,要是没拿到数据,一定要先检查是否注册,我真的被这个坑了好多次了(太傻逼了)。写这篇文章也是为了大家能够更方便的使用EventBus,同时也警告大家一定要记得注册🐶
话不多说,要是我什么地方写的有问题,请大家一定要给我指出,我会努力思考并改正的,毕竟咱只是一个平平无奇的Android小废柴,还请大家多多关照,多多指教
好了,下期我会给铁汁们整一个有关BackgroundLibrary类库(通过标签直接生成shape,无需再写shape.xml)的使用方法,再见~