RxLife

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

Download

RxLife,相较于trello/RxLifecycleuber/AutoDispose,具有如下优势:

  • 直接支持在主线程回调
  • 支持在子线程订阅观察者
  • 简单易用,学习成本低
  • 性能更优,在实现上更加简单

RxHttp&RxLife 交流群:378530627

友情提示: RxLife 与RxHttp搭配使用,味道更佳

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

Gradle 引用

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

   //if you use AndroidX
   implementation 'com.rxjava.rxlife:rxlife-x:1.0.9'
}

Usage

1、Activity/Fragment

Activity/Fragment 销毁时,自动关闭 RxJava 管道

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.as(this))     //此时的 this Activity/Fragment 对象
    .subscribe(aLong -> {
        Log.e("LJX", "accept =" + aLong);
    });

2、View

View 被移除时,自动关闭 RxJava 管道

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.as(this))  //此时的 this 为 View 对象
    .subscribe(aLong -> {
        Log.e("LJX", "accept =" + aLong);
    });

3、ViewModel

Activity/Fragment 销毁时,自动关闭 RxJava 管道,ViewModel 需要继承ScopeViewModel类,如下

public class MyViewModel extends ScopeViewModel {

    public MyViewModel(@NonNull Application application) {
        super(application);
        Observable.interval(1, 1, TimeUnit.SECONDS)
            .as(RxLife.asOnMain(this))
            .subscribe(aLong -> {
                Log.e("LJX", "MyViewModel aLong=" + aLong);
            });
    }
}

注意: 一定要在 Activity/Fragment 通过以下方式获取 ViewModel 对象,否则 RxLife 接收不到生命周期的回调


MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);

4、任意类

Activity/Fragment 销毁时,自动关闭 RxJava 管道,任意类需要继承BaseScope类,如 P 层:

public class Presenter extends BaseScope {

    public Presenter(LifecycleOwner owner) {
        super(owner); //添加生命周期监听
        Observable.interval(1, 1, TimeUnit.SECONDS)
            .as(RxLife.as(this)) //这里的 this 为 Scope 接口对象
            .subscribe(aLong -> {
                Log.e("LJX", "accept aLong=" + aLong);
            });
    }
}

5、kotlin 用户

由于as是 kotlin 中的一个关键字,所以在 kotlin 中,我们并不能直接使用as(RxLife.as(this)),可以如下编写

Observable.intervalRange(1, 100, 0, 200, TimeUnit.MILLISECONDS)
    .`as`(RxLife.`as`(this))
    .subscribe { aLong ->
        Log.e("LJX", "accept=" + aLong)
    }

当然,相信没多少人会喜欢这种写法,故,RxLife 针对 kotlin 用户,新增更为便捷的写法,如下:

Observable.intervalRange(1, 100, 0, 200, TimeUnit.MILLISECONDS)
    .life(this)
    .subscribe { aLong ->
        Log.e("LJX", "accept=" + aLong)
    }

使用life 操作符替代as操作符即可,其它均一样

6、小彩蛋

asOnMain 操作符

RxLife 还提供了asOnMain操作符,它可以指定下游的观察者在主线程中回调,如下:

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);
    });

kotlin 用户使用lifeOnMain替代asOnMain操作符,其它均一样

注意: RxLife 类里面 as 操作符,皆适用于 Flowable、ParallelFlowable、Observable、Single、Maybe、Completable 这 6 个被观察者对象

混淆

RxLife 作为开源库,可混淆,也可不混淆,如果不希望被混淆,请在 proguard-rules.pro 文件添加以下代码

-keep class com.rxjava.rxlife.**{*;}

更新日志

1.0.9

  • kotlin 中,支持在 ViewModel 及任意类使用 life、lifeOnMain 操作符

1.0.8

  • 修复在 Activity/Fragment 中,子线程订阅事件时,偶现观察者没有回调问题

1.0.7

  • BaseScope、ScopeViewModel 两个类加入 RxLife 此版本中

1.0.6

  • 代码优化

1.0.5

  • 引入作用域的概念,支持在 View 中自动中断 RxJava 管道

  • 对 Kotlin 简单适配,在 kotlin 中可使用 life 操作符绑定生命周期

1.0.4

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

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

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea