EventBus 使用总结

为什么要用EventBus:
EventBus是一个事件总线框架,观察者模式的变形,利用这个框架,我们可以方便高效地在Android组件间传递和处理数据,切换线程,降低代码耦合度。
本文基于 EventBus 3.0。

简单使用


  • 配置build.gradle
dependencies {
    implementation 'org.greenrobot:eventbus:3.0.0'
}

 

  • 观察者Java代码(以Activity为例)
@Override
protected void onResume() {
    super.onResume();
    EventBus.getDefault().register(this); //订阅事件
}

@Override
protected void onPause() {
    super.onPause();
    EventBus.getDefault().unregister(this); //Activity进入后台,取消订阅事件
}

/**
 * 事件开始传递时会回调包含 @Subscribe 这个注释的方法
 * @param event 传递的数据(Object,为了方便这里直接用String)
 */
@Subscribe
public void onEvent(String event) {

}

 

  • 发送事件
EventBus.getDefault().post("This is an event transfered by EventBus");

发送事件后,所有订阅事件的观察者会回调包含 @Subscribe 这个注释且方法参数为String的方法,可以把String换成任何我们需要的Object来传递数据。
下面说一下EventBus的进阶使用。

线程模式


EventBus总共有四种线程模式:

  • ThreadMode.POSTING
    这是缺省模式,onEvent会在发布事件的线程中运行,即发布事件和接收处理事件将会运行在同一个线程。
    这种模式下不要在onEvent中执行耗时操作,否则会延迟其他观察者的对事件的接收,阻塞线程。

  • ThreadMode.MAIN
    不论事件是在哪个线程中发布出来的,onEvent都会在UI线程中执行,即接收处理事件运行在UI线程中。
    当分发事件的线程不在UI线程中时,可以使用这种方法来更新UI。
    这种模式下不要在onEvent中执行耗时操作,否则会延迟其他观察者的对事件的接收,阻塞线程。

  • ThreadMode.BACKGROUND
    如果事件从UI线程中分发,那么onEvent就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEvent函数直接在该子线程中执行。
    这种模式下不要在onEvent中执行耗时操作,否则会延迟其他观察者的对事件的接收,阻塞线程。

  • ThreadMode.ASYNC
    无论事件在哪个线程发布,都会创建新的子线程来执行onEvent

  • 用例

@Subscribe (threadMode = ThreadMode.ASYNC)
public void onEvent(String event) {

}

粘性事件和事件优先级


这两个概念类似于粘性广播和有序广播,就不具体解释了,看一下用法

  • 粘性事件
@Subscribe (sticky = true) //声明可接收粘性事件
public void onEvent(Message m) {
    
}
EventBus.getDefault().postSticky("Post a sticky event");

这样即便事件先发出去,观察者后订阅的事件,也可以回调onEvent

 

  • 事件优先级
@Subscribe (priority = 2)  //声明接收事件的优先级,默认为0,优先级最小
public void onEvent(Message m) {
    //类似于有序广播,也可以阻止事件继续分发
    EventBus.getDefault().cancelEventDelivery(event) ; 
}

事件发送后,会按照优先级的顺序来接收事件。

注解处理器


上文中对EventBus的使用是最基本的使用方法,因为观察者类信息要通过反射获取,所以效率有所欠缺,这里推荐使用Google的注解处理器AnnotationProcessor,在编译期获取类信息,生成索引,提高运行效率。下面说一下如何配置:

  • 配置build.gradle
defaultConfig {
    ...
    javaCompileOptions {
         annotationProcessorOptions {
             arguments = [ eventBusIndex : 'org.greenrobot.eventbusperf.EventBusIndex' ]
         }
     }
}
dependencies {
    ...
    implementation 'org.greenrobot:eventbus:3.0.0'
    annotationProcessor  'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
  • 应用初始化时配置
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();
    }
}

这样配置之后,EventBus的效率就得到了提高,具体使用方法和之前相同。

使用EventBus后的代码混淆


使用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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342