Subscriber Index
订阅者索引
订阅者索引是EventBus 3的一个新特性。
这是一个可选的优化,以加快初始用户注册。
可以在构建期间使用EventBus annotation processor(注释处理器)创建订阅者索引。
虽然不需要使用索引,但在Android上推荐使用它以获得最佳性能。
Index Preconditions
注意,只有@Subscriber的订阅者方法可以编入索引,而订阅服务器和事件类是公共的。此外,由于Java的注释处理本身的技术限制,@Subscriber订阅注释在匿名类中无法识别。
当Eventbus无法使用索引时,它将在运行时自动回退到反射。
因此,它仍将工作,稍慢一点。
How to generate the index
Using annotationProcessor
如何生成索引
使用注解解释器
如果您没有使用AndroidGradle插件版本2.2.0或更高版本,请使用Android-APT配置
要启用索引生成,需要使用注释处理程序属性将EventBus注释处理器添加到构建中。此外,还设置一个参数Event BusIndex,以指定要生成的索引的完全限定类。因此,例如,将以下部分添加到您的Gradle构建脚本中:
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [eventBusIndex: 'com.zxn.eventbus.index.MyEventBusIndex']
}
}
}
}
dependencies {
implementation 'org.greenrobot:eventbus:3.1.1'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}
重构构建工程
此时发现这个MyEventBusIndex生成
Using kapt
如果要在Kotlin代码中使用Eventbus,则需要使用KAPT而不是注释处理器( annotationProcessor):
apply plugin: 'kotlin-kapt' // ensure kapt plugin is applied
dependencies {
implementation 'org.greenrobot:eventbus:3.1.1'
kapt 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}
kapt {
arguments {
arg('eventBusIndex', 'com.example.myapp.MyEventBusIndex')
}
}
Using android-apt
如果上面的内容不适用于您,您可以使用Android-APT Gradle插件将EventBus注释处理器添加到您的构建中。将以下部分添加到您的Gradle构建脚本中:
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile 'org.greenrobot:eventbus:3.1.1'
apt 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}
apt {
arguments {
eventBusIndex "com.example.myapp.MyEventBusIndex"
}
}
How to use the index
如何使用索引
成功构建项目后,将为您生成使用EventBusIndex指定的类。然后在设置EventBus时,像这样传递它:
EventBus eventBus
= EventBus.builder()
.addIndex(new MyEventBusIndex()).build();
或者,如果您想在整个应用程序中使用默认实例:
EventBus
.builder()
.addIndex(new MyEventBusIndex())
.installDefaultEventBus();
// Now the default instance uses the given index. Use it like this:
EventBus eventBus
= EventBus.getDefault();
Indexing your Libraries
您可以将相同的原则应用于作为库一部分的代码(而不是最终的应用程序)。这样,您可能有多个索引类,可以在EventBus设置期间添加这些类,例如:
EventBus eventBus = EventBus.builder()
.addIndex(new MyEventBusAppIndex())
.addIndex(new MyEventBusLibIndex()).build();