EventBus3.0性能优化之添加索引(Index)
来源:互联网 发布:uber隐瞒数据泄露事件 编辑:程序博客网 时间:2024/05/16 15:34
前言
第一次写博客,希望有不足之处多多指教,文中有错误之处也请大家批评指出。关于EventBus3.0的使用我就不说了,网上已经有很多优秀的文章讲解了,主要是说说3.0内关于提升性能的一个东东,就是添加索引.
正文
关于EventBus的索引,在EventBus 3.0用法详解中有写道
将你的每一个事件的参数类封装为一个类,然后加入这一段之后即可将EventBus3.0性能提高一倍(项目app层的gradle文件)
//原文为//provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'//目前最新版本provided 'org.greenrobot:eventbus-annotation-processor:3.0.1'
立马新建项目试试:
public static class TestEvent { public String test; public TestEvent(String test) { this.test = test; } } public static class TestEventTwo { public String test; public TestEventTwo(String test) { this.test = test; } }}---------------------activity----------------------- @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onEventTest(MEventIndex.TestEvent event) { Log.i("test",event.test); } @Subscribe(threadMode = ThreadMode.MAIN,sticky = true,priority = 1) public void onTestEvent(MEventIndex.TestEventTwo event){ Log.i("test",event.test); }--------------------------------------------------- EventBus.getDefault().post(new MEventIndex.TestEvent("testEvent")); EventBus.getDefault().post(new MEventIndex.TestEventTwo("testEventTwo"));
结果运行是
错误: No option eventBusIndex passed to annotation processor
翻译:注释处理器没有选项eventBusIndex
什么意思?我想是不是少了操作,或者是要在Application中注册自己写的EventIndex,然后经过一番研究,发现EventBus类下有一个addIndex方法,具体代码如下
EventBus.builder().addIndex(new SubscriberInfoIndex() { @Override public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) { SubscriberMethodInfo[] infos = new SubscriberMethodInfo[2]; infos[0] = new SubscriberMethodInfo("onEventTest", MEventIndex.TestEvent.class, ThreadMode.BACKGROUND); infos[1] = new SubscriberMethodInfo("onTestEvent", MEventIndex.TestEventTwo.class, ThreadMode.MAIN,1,true); return new SimpleSubscriberInfo(MEventIndex.class, true, infos); } });
我在Application中添加了这段代码后,发现还是不行,网上各种查询关于EventBus3.0的文档,发现并没有相关的任何资料或使用,只有本文开头那篇文章中提到了,但也仅仅是提到了(我想他也没有在项目中试过吧- -,或者他并不觉得这是一个问题。)
进入EventBus Github主页,也没有对于这个Index的使用说明,于是乎只能自己进入Demo(EventBusTest)查看,
结果发现在该项目gradle文件内有如下几段代码:
图1
图2
注意,在此Demo里面只有一个gradle文件,但是我们的项目有2个,一个在工程的根目录,一个在app目录下,图1 中的buildscript是写在工程根目录下gradle文件中,但是apply plugin要写在app目录下,图2 apt则是写在app目录下gradle文件中,其中eventBusIndex属性名不能变,值”org.greenrobot.eventbus.EventBusTestsIndex”可以随便写,但是不能跟你项目中的任何一个类一样,否则会报类重复错误!加上这俩段代码后,程序运行正常!
03-22 15:08:25.367 15544-15544/com.zxz.mapp I/test: testEventTwo03-22 15:08:25.375 15544-15604/com.zxz.mapp I/test: testEvent
我的gradle代码
apt { arguments { eventBusIndex "org.eventbus.test.Event" }}
我们来看看项目
可以看到在我们的项目 app 层下build/generated/source/apt/debug目录下生成了一个类
该类的目录与我们在eventBusIndex 的值中写的相对应,再看看类里面是什么
package org.eventbus.test;.../** This class is generated by EventBus, do not edit. */public class Event implements SubscriberInfoIndex { private static final Map<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX; static { SUBSCRIBER_INDEX = new HashMap<Class<?>, SubscriberInfo>(); putIndex(new SimpleSubscriberInfo(com.zxz.mapp.activitys.MainTabActivity.class, true, new SubscriberMethodInfo[] { new SubscriberMethodInfo("onEventTest", com.zxz.mapp.model.MEventIndex.TestEvent.class, ThreadMode.BACKGROUND), new SubscriberMethodInfo("onTestEvent", com.zxz.mapp.model.MEventIndex.TestEventTwo.class, ThreadMode.MAIN, 1, true), })); } private static void putIndex(SubscriberInfo info) { SUBSCRIBER_INDEX.put(info.getSubscriberClass(), info); } @Override public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) { SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass); if (info != null) { return info; } else { return null; } }}
包名org.eventbus.test,类名Event,实现SubscriberInfoIndex 接口,是不是觉得很熟悉,没错,就是我之前有写到的addIndex()方法中的参数,证明我之前的思路并没有错,看看里面的具体实现
private static final Map<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX;static { SUBSCRIBER_INDEX = new HashMap<Class<?>, SubscriberInfo>(); putIndex(new SimpleSubscriberInfo(com.zxz.mapp.activitys.MainTabActivity.class, true, new SubscriberMethodInfo[] { new SubscriberMethodInfo("onEventTest", com.zxz.mapp.model.MEventIndex.TestEvent.class, ThreadMode.BACKGROUND), new SubscriberMethodInfo("onTestEvent", com.zxz.mapp.model.MEventIndex.TestEventTwo.class, ThreadMode.MAIN, 1, true), })); }
使用一个Map保存SubscriberInfo,也就是所有订阅者的接收方法,第一个参数为订阅者的Class(key),第二个参数为SubscriberMethodInfo数组,即内中所有订阅方法集合(Value):new SubscriberMethodInfo(方法名、eventType、ThreadMode、priority、sticky);然后
@Override public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) { SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass); if (info != null) { return info; } else { return null; } }
这就是接口内定义的方法getSubscriberInfo,通过subscriberClass(key订阅者)去获得SubscriberInfo (value,也就是订阅方法集合)。
结语
至此,关于EventBus3.0的索引优化功能就讲完了,还是那句话,第一次写博客,有不足之处,多多谅解,也请多多指教,这其实也只是我的一个随笔,学习记录罢了,希望不要喷我,如果那里说错了,也请告诉我,谢谢。
- EventBus3.0性能优化之添加索引(Index)
- EventBus3.0-Subscriber Index
- [SqlServer2005+ 性能优化之索引优化]使用Include Index消除Key Lookup和RID Lookup
- EventBus3.0新特性之 Subscriber Index ,加速 EventBus
- mysql数据库优化之index索引
- MySQL 优化之 index merge(索引合并)
- oracle性能优化之索引
- sql性能优化之索引
- 数据库性能优化之索引
- Sql性能优化之索引
- Mysql性能优化之索引
- 【MySQL】性能优化之 index merge (1)
- 【MySQL】性能优化之 Index Condition Pushdown
- 【MySQL】性能优化之 Index Condition Pushdown
- MySQL - 性能优化 索引的创建、删除和查看 index
- MySQL 数据库性能优化之(三)索引优化
- 【Day61】MySQL数据库性能优化之三(索引优化)
- Mysql性能优化之索引及优化(一)
- 使用JDBC中PreparedStatement时,sql语句中中文出现问号
- Android 中Base64编码解码
- 剑指offer面试题之变态跳台阶
- 166. Fraction to Recurring Decimal
- eclipse从数据库获取数据时控制台乱码问题
- EventBus3.0性能优化之添加索引(Index)
- ios 应用内支付(In-App Purchase,沙盒测试,后台验证)
- 装修之mybatis环境搭建
- 简单排序算法(一)
- Android LIstView隐藏滚动条
- canvas中2D画线详解
- 初识Java设计模式之Builder
- MySQL中授权(grant)和撤销授权(revoke) 【转】
- java多线程状态