EventBus源码---索引优化的使用

搞了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注解的设置了。对于手动写索引文件,我们其实可以参照自动设置索引时生成的索引文件来写。当然,你都自动生成索引文件了,干嘛还要手写呢,哈哈。

好了,关于索引优化的使用,到这里就结束了,有问题欢迎留言。

你可能感兴趣的:(移动架构,android)