EventBus VS. Otto bus

EventBus 笔记

APP中模块/层级间交互的逻辑处理往往也起着关键性的作用,一般较为常见的是通过自定义的接口即回调( callback )的方式实现,但是逻辑稍微复杂的情况下很容易发展为callback hell。本篇我们要看的是另外的一种方式,即采用Event bus来解耦发送端与接收端。实质上看 EventBus 是设计模式中 Observer模式 的典型代表。

先看到主流的Event bus 的对比 (Greenrobot EventBus VS. Otto Bus):

0. 性能对比

先摘录官方的 Comparison 对比一览表

1. 对DeadEvent的处理

OttoBus 对没有接收者的事件,保留了和 Guava eventbus 相同处理方式,即发现没有处理事件的handler时将发出 DeadEvent,此时 DeadEvent 将事件的发送者和源事件包装起来了。

而 Greenrobot EventBus 中则附加定义了 postSticky 的方法,会在内存中缓存 ( Sticky Events map 默认以 Event class作为key保存 ) 最近的 Sticky Event 对象,在接收的方法中明确指定 stickytrue 时,则可以自动处理;但值得注意的是,此时如未指定stickytrue,则不能收到 event。同时在处理完了Sticky Event之后,需要手动移除,以避免重复处理该事件。

@Subscribe(sticky = true)
public void onHandle(YourEvent event) {
    // process your sticky event
    // ...
    EventBus.getDefault().removeStickyEvent(event);
}

相较之下,OttoBus 则可能需要自行搜集所有的DeadEvent,然后适时再次发送。

2. 事件处理的可继承性与订阅者索引

由于EventBus 对Event 以及 Subscriber 的继承性都进行了实现,简单来讲基类的订阅逻辑在子类中同样是有效的;而Otto bus则处于性能上的考虑未能给予支持。

再看 Greenrobot EventBus,为了优化性能,减少靠反射调用来查找事件的订阅方法,EventBus 推荐采用对订阅者建立索引, 最终利用 annotation processor 生成索引类,使用 builder 模式构建最后的 EventBus 实例(将复杂度从运行时转到了编译期 😁)。

⚠️如果项目中引入了 Kotlin 或是已经是完全的 Kotlin开发,请使用

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.example.myapp.MyEventBusIndex')
    }
}

而无需同时指定

javaCompileOptions {
      annotationProcessorOptions {
              arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
      }
}     

否则,可能无法生成 MyEventBusIndex class.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 何为EventBus 说到EventBus就不得不提下观察者模式,这个设计模式相信大家都很熟悉了,在这个模式里有2...
    tmp_zhao阅读 6,993评论 0 9
  • 项目到了一定阶段会出现一种甜蜜的负担:业务的不断发展与人员的流动性越来越大,代码维护与测试回归流程越来越繁琐。这个...
    fdacc6a1e764阅读 8,456评论 0 6
  • EventBus(发布订阅事件总线):通过解耦发布者和订阅者简化android 事件传递 EventBus is ...
    JustinJwu阅读 3,741评论 0 0
  • EventBus是一个Android平台上的事件发送/订阅框架,采用观察者模式实现,可以优化组件间的信息传递过程。...
    华枯荣阅读 10,380评论 2 3
  • EventBus基本使用 EventBus基于观察者模式的Android事件分发总线。 从这个图可以看出,Even...
    顾氏名清明阅读 3,848评论 0 1

友情链接更多精彩内容