Android开发经验谈Android技术知识Android开发

Android | 这是一份详细的 EventBus 使用教程

2020-02-27  本文已影响0人  彭旭锐

前言

目录


1. EventBus 机制简介

EventBus版本变更示意图 EventBus原理示意图 示意图

2. 相关概念

关于EventBus机制的相关概念如下:

EventBus相关概念示意图

3. 使用步骤

3.1 步骤1:添加依赖

dependencies {
    def eventbus_version = '3.2.0'
    implementation "org.greenrobot:eventbus:$eventbus_version"
}
// Java:
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ eventBusIndex : 'com.have.a.good.MyEventBusAppIndex' ]
            }
        }
    }
}
 
dependencies {
    def eventbus_version = '3.2.0'
    implementation "org.greenrobot:eventbus:$eventbus_version"
    annotationProcessor "org.greenrobot:eventbus-annotation-processor:$eventbus_version"
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt' // ensure kapt plugin is applied
 
dependencies {
    def eventbus_version = '3.2.0'
    implementation "org.greenrobot:eventbus:$eventbus_version"
    kapt "org.greenrobot:eventbus-annotation-processor:$eventbus_version"
}
 
kapt {
    arguments {
        arg('eventBusIndex', 'com.have.a.good.MyEventBusAppIndex')
    }
}

3.2 步骤2:准备订阅者

准备订阅者 五种线程模式

3.3 步骤3:注册与注销

注册与注销
@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}
 
@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

3.4 步骤4:发布事件

发布事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
粘性事件
// 1. 订阅
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {   
    textField.setText(event.message);
}
// 2. 发布
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
// 3. 获取粘性事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
if(stickyEvent != null) {
    // 4. 移除粘性事件
    EventBus.getDefault().removeStickyEvent(stickyEvent);
    // do something.
}
// 5. 移除粘性事件
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
if(stickyEvent != null) {
    // do something.
}

4. 编译时索引

编译时索引
kapt {
    arguments {
        arg('eventBusIndex', 'com.have.a.good.MyEventBusAppIndex')
    }
}
EventBus eventBus = EventBus.builder()
    .addIndex(new MyEventBusAppIndex())
    .build();
// App module 
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt' // ensure kapt plugin is applied

kapt {
    arguments {
        arg('eventBusIndex', 'com.have.a.good.MyEventBusAppIndex')
    }
}

dependencies {
    ...
    kapt "org.greenrobot:eventbus-annotation-processor:3.2.0"
    implementation project(path: ':base')
}

// Lib module
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt' // ensure kapt plugin is applied

kapt {
    arguments {
        arg('eventBusIndex', 'com.have.a.good.MyEventBusLibIndex')
    }
}

dependencies {
    ...
    api 'org.greenrobot:eventbus:3.2.0'
    kapt "org.greenrobot:eventbus-annotation-processor:3.2.0"
    implementation project(path: ':base')
}

以上配置将生成两个索引类文件,MyEventBusAppIndex类只包含App Module中的订阅者索引,而MyEventBusLibIndex只包含Lib Module中的订阅者索引。


5. 构建者模式


6. 混淆

-keepattributes *Annotation*
// keep住所有被Subscribe注解标注的方法
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

这里着重讲解一下注释部分,因为生成编译时索引是在代码混淆之前进行的,而代码混淆之后类名和方法名都不一样了,这样就会导致运行时找不到编译时索引中记录的方法名了,因而得keep住所有被@Subscribe注解标注的方法。

-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

7. 总结


推荐阅读


2020 永远不要放弃希望,祝愿大家都能够平安健康!武汉加油!

上一篇 下一篇

猜你喜欢

热点阅读