围绕这个上面几个问题,我在eventbus的基础上进行了改善。 优化前期以类为区分监听接收对象,需要创建很多类,优化后采用字符串方式作为事件event-key区分代替以类的方式,避免创建太多类,减少代码量,比较优雅,本思想也参考ios通知的实现。 支持返回值,支持private和static的方法 优化前,订阅者需要订阅很多监听方法来区分分类,优化后可以减少监听方法,在一个方法或多个方法里面进行分类判断即可,思想来自handler 优化前维护难,表现在不清楚事件发生源,优化后,可以统一管理事件vent key,方便管理查找bug 支持只发送事件的功能 支持冷冻事件方法,和解除冷冻事件的方法 其他方面如Subscribe订阅方法,线程模式的,粘性事件等的处理均和eventbus3.0的处理一致。 项目使用: 和eventbus3.0版本的使用方式差不多,是eventbus3.0改进,下面看看怎么使用 msg是我们需要发送的数据,可以是任何数据 发送事件: 接收事件: 发送事件: 这里的构造函数参数分别是msg,event 接收数据: 发送事件1: 发送事件2: 这里的构造函数参数分别是msg,event,arg 接收事件: 发送订阅消息: 接收事件: 注意: 说明: 冷冻事件后,发送相对应的事件,订阅的方法将不能接收到这个时间,但这个订阅的方法并没有真的移除掉,可以通过重新激活这个方法,下次发送便可以再接收到 冷冻方法: 激活方法:
一、前言
eventbus3.0的优缺点分析:
eventbus基于观察者模式,用很少的代码,帮我们实现很多功能,使我们的代码变得很优雅。但是大面积的使用eventbus之后,会发现一些很严重的问题
二、改善说明: 基于android eventbus 3.0 版本优化:
androidstudio gradle 引入:implementation ‘com.github.chenjk-520:keventbus:1.1’
项目开源地址:github地址
,如果觉得好用就给个Star或给个打赏吧。如果需要改进的地方,清在下面评论或发送私信到我的邮件13544216361@163.com
三、使用说明
private T msg; private String event; private int arg; private CallBack callBack;
event是我们一个事件对应的event,通过这个event我们可以找到订阅的方法。
arg,是event的在一次分类
callBack 是处理发送广播后的回调。1.注册事件与取消注册事件
注册事件: KeventBus.getDefault().register(this); 取消注册事件: KeventBus.getDefault().unregister(this);
2. 只使用event-key,不发送数据
KeventBus.getDefault().post(TestKey.SAY_HELLO);
@Subscribe(event = TestKey.SAY_HELLO,threadMode = ThreadMode.MAIN) public void hello(EventMessage<String> msg){ Log.i("TAG",msg.getEvent()); } 其中post事件TestKey.SAY_HELLO,与@Subscribe的event = TestKey.SAY_HELLO一一对应才可以接收到
3. 使用event-key,并发送数据
KeventBus.getDefault().post(new EventMessage<>("say hello!",TestKey.SAY_HELLO));
@Subscribe(event = TestKey.SAY_HELLO,threadMode = ThreadMode.MAIN) public void hello(EventMessage<String> msg){ Log.i("TAG",msg.getMsg()); }
4. 使用event-key,并发送数据, 在同一订阅方法里面再区分,有点类似handler的message,event相当于是what属性,arg也跟message的arg一样
KeventBus.getDefault().post(new EventMessage("data==1",TestKey.SAY_HELLO,1));
KeventBus.getDefault().post(new EventMessage("data==2",TestKey.SAY_HELLO,2));
@Subscribe(event = TestKey.SAY_HELLO,threadMode = ThreadMode.MAIN) public void hello34(EventMessage<String> msg){ if (msg.getArg() == 1){ Toast.makeText(this,msg.getMsg(),Toast.LENGTH_SHORT).show(); }else if(msg.getArg() == 2 ){ Toast.makeText(this,msg.getMsg(),Toast.LENGTH_SHORT).show(); } }
5. 支持发送订阅消息后回调
KeventBus.getDefault().post(new EventMessage<String>("测试data",TestKey.SAY_HELLO, new EventMessage.CallBack<String>() { @Override public void onCall(String result, int arg) { //在这里处理回调数据 Log.i("TAG",result); } }));
@Subscribe(event = TestKey.SAY_HELLO4,threadMode = ThreadMode.ASYNC,enback = true) private String hello5(EventMessage msg){ Log.i("TAG",msg.getMsg()); return "测试返回值"; }
1.接收事件需要加上enback = true
2.这里的回调之后的是接收事件的线程,如果在主线程里面发出的,在子线程接收并返回的事件,回调的方法是接收方法的线程,如果需要toast的话,需要自己切换到主线程再处理5. 支持冷冻事件和激活事件
KeventBus.getDefault().freezeSubscribeEvent(TestKey.SAY_HELLO);
KeventBus.getDefault().activeEvent(TestKey.SAY_HELLO);
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算