搞了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注解的設定了,對于手動寫索引檔案,我們其實可以參照自動設定索引時生成的索引檔案來寫,當然,你都自動生成索引檔案了,干嘛還要手寫呢,哈哈,
好了,關于索引優化的使用,到這里就結束了,有問題歡迎留言,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/243870.html
標籤:其他
上一篇:原來這么簡單!使用PopupWindow制作微信頂部選單項,Android經典應用實體集錦1000例之(第3例)
