搞了4个小时左右,终于把EventBus的索引优化弄明白了。这里的明白是知道怎么使用了,源码的话,我们下篇文章来说。所以这篇文章我们仅从使用上面来说索引优化。有的同学可能会说,使用嘛,即便是没用过,百度一下也就OK了。以下两点,是我要写这篇博客的原因:
(1)我问了我身边做Android开发的朋友,他们使用EventBus都没有使用过索引优化,不使用索引优化也没有感觉EventBus慢。既然这样,谁还会去理这个索引优化呢?所以,大家好像都不怎么关心索引优化。我们要想技术上高人一等,就要知道别人所不知道的一些东西
(2)网上的确有些博客,但是对于这个索引优化说的都不是很清楚。
对于索引优化,我之前一直混淆了两个东西:索引和APT。我一直以为EventBus的索引优化就是使用了APT技术,所以一直带着这个想法去看博客和做测试,结果可想而知,自己糊涂了。那真正的情况是什么呢?其实索引优化就是索引优化,它有两种实现方式:手动设置索引和自动设置索引。自动设置索引其实才是使用APT技术实现的。而网上一些索引优化的博客,一些是手动实现的,一些是使用APT技术实现的,所以这是我糊涂的真正原因。
既然有两种实现方式,那我们就一种一种的来说。
一、自动设置索引(APT)
自动设置索引的方式应该比手动设置所以更常用,毕竟代码是APT来自动生成的,实现的代码比较少;其次,对于EventBus的使用来说,和设置索引没有什么区别。
首先在项目build.gradle中添加一下代码:
dependencies {
....
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
然后再module的build.gradle添加:
android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [eventBusIndex : 'com.gzc.mytest.MyEventBusIndex']
}
}
}
....
}
dependencies {
....
//我这里直接使用的EventBus的源码module,可以换成相应的依赖地址
implementation project(path: ':eventbus')
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.2.0'
}
1.在defaultConfig中的代码作用是APT生成的文件名称及路径
2.dependencies中不要忘了添加上anotationProcessor这句代码
之后,我们需要在Application文件中进行索引的设置
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
EventBus.builder()
.addIndex(new MyEventBusIndex())
.installDefaultEventBus();
}
}
addIndex中的类就是我们在build.gradle中所设置APT生成的类;而installDefaultEventBus则是重新设置了EventBus中的defaultInstance
之后该做什么了呢?其实就是EventBus的正常使用了,进行注册,post,添加注解等常规操作了。自动生成索引到这里就结束了。
二、手动设置索引
其实手动设置索引比自动的方式要稍微复杂一点点,不如自动设置索引方便。因为不使用APT,所以不需要要在项目和module的build.gradle进行特殊的设置。我们只需要去写索引文件就行。索引文件如何写呢?我们看下面的例子
public class ManualEventBusIndex implements SubscriberInfoIndex {
@Override
public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) {
SubscriberMethodInfo[] infos = new SubscriberMethodInfo[] {
new SubscriberMethodInfo("test", TestBean.class, ThreadMode.MAIN),
};
return new SimpleSubscriberInfo(subscriberClass,true,infos);
}
}
1.首先,这个索引文件需要实现SubscriberInfoIndex接口,实现getSubscriberInfo方法
2.在方法中创建SubscriberMethodInfo数组,从这个类名我们可以猜测,主要是注册者的方法信息,我们从上面的例子中得知:SubscriberMethodInfo构造方法有三个参数(其实有多个构造方法,小伙伴可以自行查看):第一个参数是注册者中接收事件方法;第二参数是接收事件的类型;第三个参数是接收事件的线程。总之,在@Subscribe注解中的属性,SubscriberMethodInfo的构造方法都能体现出来。
3.最后返回了SimpleSubscriberInfo这个类。并且添加了三个参数:注册类,是否进行父类检查,还有刚刚所说的数组。需要注意的是,第一个参数一定要写getSubscriberinfo方法的参数subscriberClass,不要自己填写注册的类,自己就在这里踩过坑。
然后我们在Application中进行设置
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
EventBus.builder()
.addIndex(new ManualEventBusIndex())
.installDefaultEventBus();
}
}
手动进行索引设置有一个好处就是,不需要再进行设置@Subscribe注解的设置了。对于手动写索引文件,我们其实可以参照自动设置索引时生成的索引文件来写。当然,你都自动生成索引文件了,干嘛还要手写呢,哈哈。
好了,关于索引优化的使用,到这里就结束了,有问题欢迎留言。