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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
abp-vnex eventbus是一个用于在ABP框架中进行事件通信的模块。要使用abp-vnex eventbus,您需要按照以下步骤进行安装和配置: 1. 首先,您需要安装abp-vnex eventbus模块。可以通过运行以下命令来安装: ```shell npm install abp-vnex-eventbus --save ``` 2. 安装完成后,您需要在您的应用程序的模块中导入abp-vnex eventbus模块。在您的模块文件中,添加以下代码: ```typescript import { AbpVnexEventBusModule } from 'abp-vnex-eventbus'; @NgModule({ imports: [ AbpVnexEventBusModule ] }) export class YourModule { } ``` 3. 现在,您可以在您的组件或服务中使用abp-vnex eventbus来发送和接收事件。首先,您需要导入`AbpVnexEventBusService`: ```typescript import { AbpVnexEventBusService } from 'abp-vnex-eventbus'; ``` 4. 在您的组件或服务中,您可以使用`AbpVnexEventBusService`的`emit`方法来发送事件。例如,发送一个名为`myEvent`的事件: ```typescript constructor(private eventBus: AbpVnexEventBusService) { } sendEvent() { this.eventBus.emit('myEvent', { data: 'Hello World' }); } ``` 5. 要接收事件,您可以使用`AbpVnexEventBusService`的`on`方法。在您的组件或服务中,添加以下代码: ```typescript constructor(private eventBus: AbpVnexEventBusService) { } ngOnInit() { this.eventBus.on('myEvent').subscribe((eventData) => { console.log(eventData.data); // 输出:Hello World }); } ``` 这样,您就可以使用abp-vnex eventbus模块来进行事件通信了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值