一行代码解决RxJava 内存泄漏
xLife
RxLife,相较于trello/RxLifecycle、uber/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.**{*;}