RxLife

Project Url: liujingxing/RxLife
Introduction: 一款轻量级别的 RxJava 生命周期管理库
More: Author   ReportBugs   
Tags:

为什么要重复造轮子

熟悉 RxJava 的同学应该都知道 trello/RxLifecycle 项目,它在目前的 3.0.0 版本中通过 Lifecycle 感知 Activity/Fragment 的生命周期变化,并通过 BehaviorSubject 类及 compose、takeUntil 操作符来实现管道的中断,这种实现原理有一点不足的是,它在管道断开后,始终会往下游发送一个 onComplete 事件,这对于在 onComplete 事件中有业务逻辑的同学来说,无疑是致命的。那为什么会这样呢?因为 takeUntil 操作符内部实现机制就是这样的,有兴趣的同学可以去阅读 takeUntil 操作符的源码,这里不展开。而 RxLife 就不会有这样问题,因为在原理上 RxLife 就与 trello/RxLifecycle 不同,并且 RxLife 还在 as 操作都的基础上提供了一些额外的 api,能有效的避免因 RxJava 内部类持有 Activity/Fragment 的引用,而造成的内存泄漏问题

详细介绍:https://juejin.im/post/5cb964385188251c5146d429

Gradle 引用方法

dependencies {
   implementation 'com.rxjava.rxlife:rxlife:1.0.4'

   //AndroidX
   implementation 'com.rxjava.rxlife:rxlife-x:1.0.4'
}

在 Activity/Fragment 的 onDestroy 自动断开

    Observable.timer(5, TimeUnit.SECONDS)
            .as(RxLife.as(this))
            .subscribe(aLong -> {
                Log.e("LJX", "accept =" + aLong);
            });

Activity/Fragment 的 onStop 自动断开

    Observable.timer(5, TimeUnit.SECONDS)
            .as(RxLife.as(this, Event.ON_STOP))
            .subscribe(aLong -> {
                Log.e("LJX", "accept =" + aLong);
            });

在 Activity/Fragment 的 onDestroy 自动断开,并中断上下游的引用,在主线程回调

    Observable.timer(5, TimeUnit.SECONDS)
            .as(RxLife.asOnMain(this))
            .subscribe(aLong -> {
                Log.e("LJX", "accept =" + aLong);
            });

            //等价于
    Observable.timer(5, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .as(RxLife.as(this))
            .subscribe(aLong -> {
                Log.e("LJX", "accept =" + aLong);
            });

Activity/Fragment 的 onStop 自动断开,并中断上下游的引用,在主线程回调

    Observable.timer(5, TimeUnit.SECONDS)
            .as(RxLife.asOnMain(this, Event.ON_STOP))
            .subscribe(aLong -> {
                Log.e("LJX", "accept =" + aLong);
            });

            //等价于
    Observable.timer(5, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .as(RxLife.as(this, Event.ON_STOP))
            .subscribe(aLong -> {
                Log.e("LJX", "accept =" + aLong);
            });

RxLife 类里面 as 操作符,皆适用于 Flowable、ParallelFlowable、Observable、Single、Maybe、Completable 这 6 个被观察者对象 使用 as 操作符,无需担心下游有自己的事件

注意!!!!!!!

结合 RxLife 使用 Observable 的 lift、compose 操作符时,下游除了 subscribe 操作符外最好不要有其它的操作符,前面讲过,当调用 Disposable.dispose()时,它会往上一层一层的调用上游的 dispose()方法,如果下游有 Disposable 对象,是调用不到的,如果此时下游有自己的事件需要发送,那么就无法拦截了

1.0.4 更新日志

1、新增 as 操作符,规定下游只能使用 subscribe 操作符

2、lift、compose 标记为过时,在未来的版本中将会删除,请使用 as 操作符替代

Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea