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 ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
(java.lang.Throwable);
}