Eventbus2.X與Eventbus3對比
1. 注冊訂閱者
Eventbus3.0只有一個register
方法
//3.0版本的注冊
EventBus.getDefault().register(this);
//2.x版本的注冊
EventBus.getDefault().register(this);
EventBus.getDefault().register(this, 100);
EventBus.getDefault().registerSticky(this);
EventBus.getDefault().registerSticky(this, 100);
2. 解除注冊
一樣
EventBus.getDefault().unregister(this);
3. 發送事件
一樣
EventBus.getDefault().post(new MessageEvent());
EventBus.getDefault().postSticky(new MessageEvent());
4. 編寫響應事件訂閱方法
使用了注解
//3.0版本
@Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true, priority = 100)
public void onMessageEvent(MessageEvent event) {
}
//2.x版本
public void onEvent(String str) {
}
public void onEventMainThread(String str) {
}
public void onEventBackgroundThread(String str) {
}
5. 索引(Subscriber Index)
以前的版本為了保證性能,在遍歷尋找訂閱者的回調方法時使用反射而不是注解。用了注解性能就沒有以前好了,但是加入索引后,性能得到了大幅度提高
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();
Eventbus3遷移
看了上面的對比后,基本就清楚了遷移3.0需要做什么
1. 添加eventbus:3.0.0
//compile 'de.greenrobot:eventbus:2.4.0'
compile 'org.greenrobot:eventbus:3.0.0'
2. 修改register代碼
3.0版本的注冊只有一種方法
EventBus.getDefault().register(this);
刪除 2.x版本的注冊
EventBus.getDefault().register(this, int);
EventBus.getDefault().registerSticky(this, int);
EventBus.getDefault().registerSticky(this);
3. 修改編寫響應事件訂閱方法
由于工作量大,所以提供2種方案去修改
1. live Templates
Preferences -- live Templates 添加
@Subscribe(threadMode = ThreadMode.MAIN)
public void on$Event$($Event$ event) {
}
Abbreviation: eventBus(你自己起你喜歡的名字)
Define 全選或者選java
使用的時候只要輸入eventBus,在輸入XXXEvent就好了,threadMode,sticky,priority需要手動改下,畢竟MAIN用的比較多
2. 使用python全局修改
執行這段python代碼
import os
TARGET_FOLDER = '項目/src/main/java'
def convert_string(line):
temp_string = ' on' + line.split('(')[1].split(' ')[0] + '('
return temp_string
def convert_file(file_name):
is_back = False
is_add_import = False
line_num = 0
with open(file_name, "r") as file, open("%s.bak" % file_name, "w") as back_file:
for line in file:
if line.find('de.greenrobot.event.EventBus') > 0:
is_back = True
elif line.find(' onEventMainThread(') > 0 \
or line.find(' onEventBackgroundThread(') > 0 \
or line.find(' onEvent(') > 0:
is_back = True
is_add_import = True
break
file.seek(0, 0)
for line in file:
line_num += 1
if line_num is 3 and is_add_import is True:
back_file.write('import org.greenrobot.eventbus.Subscribe;\n')
back_file.write('import org.greenrobot.eventbus.ThreadMode;\n')
if line.find('de.greenrobot.event.EventBus;') > 0:
back_file.write('import org.greenrobot.eventbus.EventBus;\n')
line = ''
elif line.find(' onEventMainThread(') > 0:
back_file.write(' @Subscribe(threadMode = ThreadMode.MAIN)\n')
temp_string = convert_string(line)
line = line.replace(' onEventMainThread(', temp_string)
elif line.find(' onEventBackgroundThread(') > 0:
back_file.write(' @Subscribe(threadMode = ThreadMode.BACKGROUND)\n')
temp_string = convert_string(line)
line = line.replace(' onEventBackgroundThread(', temp_string)
elif line.find(' onEvent(') > 0:
back_file.write(' @Subscribe(threadMode = ThreadMode.POSTING)\n')
temp_string = convert_string(line)
line = line.replace(' onEvent(', temp_string)
back_file.write(line)
if is_back:
os.rename(back_file.name, file_name)
elif os.path.exists(back_file.name):
os.remove(back_file.name)
def seek_file():
for d, fd, fl in os.walk(TARGET_FOLDER):
for f in fl:
suffix = os.path.splitext(f)[1][1:]
if suffix == 'java':
convert_file(d + '/' + f)
if __name__ == "__main__":
seek_file()
有強迫癥的import部分可以自己格式化下
4. Sticky和Priority
需要手動修改
5. Subscriber Index
不加索引EventBus3的性能沒有EventBus2.4的好,所以必須加
不使用default的情況
EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();
使用default的情況
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
EventBus eventBus = EventBus.getDefault();
所以在Application或者自己有寫AndroidEventBus之類的工具類的地方加上
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
1. 使用android-apt
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
apt {
arguments {
eventBusIndex "com.example.myapp.MyEventBusIndex"
}
}
android-apt切換為官方annotationProcessor
2. 使用annotationProcessor
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
}
}
}
}
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
com.example.myapp.MyEventBusIndex
可以自己換
6. 混淆
# eventbus
-keepclassmembers class * {
public void onEvent*(**);
}
改為
# eventbus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}