添加完依赖之后就可以直接使用啦,但是为了方便使用,我对eventbus数据传输的几个重要方法进行了封装
相对应的,EventMessage则是我对post对象的封装
因为我在进行数据传输的时候,是根据code去判断到底是哪个事件的,所以我这里对各种事件相对应的code也进行了统一的处理,形成了一个常量池EventCode
然后在onCreate和onDestory里面分别对EventBus进行注册(register)和注销(unregister)
上面是对于非粘性事件的处理,好了,一定有小伙伴要问了,什么叫粘性事件,什么叫非粘性事件(普通事件),我这边粘一段比较官方的说法: 好了,下期我会给铁汁们整一个有关BackgroundLibrary类库(通过标签直接生成shape,无需再写shape.xml)的使用方法,再见~
嗯~本人为Android萌新程序猿一枚
这是我在博客写的第一篇文章,怀着忐忑的心情终于落笔了
各位来自天南海北的再生父母们,喜欢的话可以加个关注,点个赞(能打赏的话那真的是给您磕头了),谢谢铁汁🚪
好了,废话不多说,直接开冲
EventBus简介
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
使用方法
第一步当然是添加依赖啦:
api 'org.greenrobot:eventbus:3.1.1'
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); } }
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 + '}'; } }
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; }
@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小废柴,还请大家多多关照,多多指教
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算