美文网首页
EventBus,RxBus,LiveDataBus对比分析

EventBus,RxBus,LiveDataBus对比分析

作者: Johnson_Coding | 来源:发表于2019-11-26 13:33 被阅读0次

三者最大的作用都是对一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化Android事件传递。

一、Eventbus

EventBus可以代替Android传统的Intent、Handler、Broadcast或接口回调,在Fragment、Activity、Service线程之间传递数据,执行方法。EventBus最大的特点就是简洁、解耦。在没有EventBus之前我们通常用广播来实现监听,或者自定义接口函数回调,有的场景我们也可以直接用Intent携带简单数据,或者在线程之间通过Handler处理消息传递。但无论是广播还是Handler机制远远不能满足我们高效的开发。EventBus简化了应用程序内各组件间、组件与后台线程间的通信。EventBus一经推出,便受到广大开发者的推崇。EventBus给Android开发者世界带来了一种新的框架和思想,就是消息的发布和订阅。这种思想在其后很多框架中都得到了应用。


image.png

发布/订阅模式

订阅发布模式定义了一种“一对多”的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。


image.png

使用起来很简单:

image.png

存在的问题:
① 需要引入两个包,增加APK体积

image.png
此外,包的内部还依赖了以下几个库,造成更多的包大小以及与项目中存在某些包的版本冲突:
image.png
②每次都要注册和反注册,写法繁琐存在内存泄漏风险。

二、RxBus的出现

RxBus不是一个库,而是一个文件,实现只有短短30行代码。RxBus本身不需要过多分析,它的强大完全来自于它基于的RxJava技术。响应式编程(Reactive Programming)技术这几年特别火,RxJava是它在Java上的实作。RxJava天生就是发布/订阅模式,而且很容易处理线程切换。所以,RxBus凭借区区30行代码,就敢挑战EventBus“江湖老大”的地位。

RxBus原理

在RxJava中有个Subject类,它继承Observable类,同时实现了Observer接口,因此Subject可以同时担当订阅者和被订阅者的角色,我们使用Subject的子类PublishSubject来创建一个Subject对象(PublishSubject只有被订阅后才会把接收到的事件立刻发送给订阅者),在需要接收事件的地方,订阅该Subject对象,之后如果Subject对象接收到事件,则会发射给该订阅者,此时Subject对象充当被订阅者的角色。完成了订阅,在需要发送事件的地方将事件发送给之前被订阅的Subject对象,则此时Subject对象作为订阅者接收事件,然后会立刻将事件转发给订阅该Subject对象的订阅者,以便订阅者处理相应事件,到这里就完成了事件的发送与处理。

RxBus有很多实现,如:

AndroidKnife/RxBus(https://github.com/AndroidKnife/RxBus) Blankj/RxBus(https://github.com/Blankj/RxBus

由于MDD项目已经使用了RxJava2所以需要引入的包已经现有,很好地利用了,其实正如前面所说的,RxBus的原理是如此简单,我们项目中自己实现的RxBus:


image.png

发送事件:


image.png

很简单的一个自定义RxBus类和使用,但是存在两个问题:

① 项目存在一个页面订阅多个事件(如AppHomeActivity目前订阅四个事件总线,需要重复代码RxBus.getInstance().toObservable… 四遍太臃肿,可读性差)
② 使用RxJava发布一个订阅后,当页面被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity/Fragment无法被回收,从而引发内存泄漏。

针对①封装了一层通用bean,采用switch判断统一处理:


image.png
image.png
对比旧的eventbus:
image.png image.png

针对②,其实项目中的retrofit中已经碰到此类问题,只需使用一个CompositeDisposable存储当前所有的订阅,然后再onDestroy()中将其dispose()。


image.png
image.png
三、LiveEventBus

从LiveData谈起

LiveData是Android Architecture Components提出的框架。LiveData是一个可以被观察的数据持有类,它可以感知并遵循Activity、Fragment或Service等组件的生命周期。正是由于LiveData对组件生命周期可感知特点,因此可以做到仅在组件处于生命周期的激活状态时才更新UI数据。LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化;在观察者处于其他状态时,即使LiveData的数据变化了,也不会通知。

LiveDataBus原理图

image.png

LiveData的优点

image.png

LiveDataBus的实现

image.png
image.png image.png
image.png image.png
image.png
image.png image.png image.png

LiveEventBus****使用:

在工程中引用

implementation 'com.jeremyliao:live-event-bus:1.5.7'

配置

在Application.onCreate方法中配置:

LiveEventBus
        .config() ...

supportBroadcast 配置支持跨进程、跨APP通信
lifecycleObserverAlwaysActive 配置LifecycleObserver(如Activity)接收消息的模式(默认值true)
autoClear 配置在没有Observer关联的时候是否自动清除LiveEvent以释放内存(默认值false)

使用方法

以生命周期感知模式订阅消息(根据THIS绑定生命周期)
LiveEventBus
    .get("key_name", String.class)
    .observe(this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String s) {
        }
    });
发送消息
  • post
    发送一个消息,支持前台线程、后台线程发送
LiveEventBus
    .get("key_name")
    .post(value);

存在的问题:

① 需要引入liveeventbus包占用体积,内部更是引入了多个jar包。

image.png

② 为了自动感应生命周期引入lifecycle库,同时为了支持跨进程、跨APP通信、AndroidX等增加很多类,目前MDD根本用不到,有点事倍功半。

总结

通过3种事件总线引入代价和收益对比分析以及MDD项目对其使用较少和程度较浅,最终选择Rxbus方式。

相关文章

网友评论

      本文标题:EventBus,RxBus,LiveDataBus对比分析

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