美文网首页
Eventbus2.X迁移Eventbus3

Eventbus2.X迁移Eventbus3

作者: 梦sora | 来源:发表于2017-03-16 20:29 被阅读122次

    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);
    }
    

    相关文章

      网友评论

          本文标题:Eventbus2.X迁移Eventbus3

          本文链接:https://www.haomeiwen.com/subject/cihhnttx.html