注册

一行代码解决RxJava 内存泄漏

xLife

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

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

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

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

Gradle引用

jitpack添加到项目的build.gradle文件中,如下:

allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}

注:RxLife 2.1.0 版本起,已全面从JCenter迁移至jitpack

新版本仅支持AndroidX项目

dependencies {
//kotlin协程
implementation 'com.github.liujingxing.rxlife:rxlife-coroutine:2.1.0'

//rxjava2
implementation 'com.github.liujingxing.rxlife:rxlife-rxjava2:2.1.0'

//rxjava3
implementation 'com.github.liujingxing.rxlife:rxlife-rxjava3:2.1.0'
}

注意:RxJava2 使用Rxlife.asXxx方法;RxJava3使用Rxlife.toXxx方法

非AndroidX项目

非AndroidX项目,请使用旧版本RxLife

implementation 'com.rxjava.rxlife:rxlife:2.0.0'

由于Google在19年就停止了非AndroidX库的更新,故rxlife旧版本不再维护,请尽快将项目迁移至AndroidX

#Usage

1、FragmentActivity/Fragment

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

Observable.timer(5, TimeUnit.SECONDS)
.as(RxLife.as(this)) //此时的this FragmentActivity/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);
}

public void test(){
Observable.interval(1, 1, TimeUnit.SECONDS)
.as(RxLife.asOnMain(this)) //继承ScopeViewModel后,就可以直接传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); //添加生命周期监听
}

public void test(){
Observable.interval(1, 1, TimeUnit.SECONDS)
.as(RxLife.as(this)) //继承BaseScope后,就可以直接传this
.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.**{*;}


代码下载:327744707-rxjava-RxLife-master.zip

0 个评论

要回复文章请先登录注册