搞了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註解的設置了。對於手動寫索引文件,我們其實可以參照自動設置索引時生成的索引文件來寫。當然,你都自動生成索引文件了,幹嘛還要手寫呢,哈哈。
好了,關於索引優化的使用,到這裏就結束了,有問題歡迎留言。