Android使用Rxlifecycle解决RxJava内存泄漏
Posted Tobey_r1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android使用Rxlifecycle解决RxJava内存泄漏相关的知识,希望对你有一定的参考价值。
android使用Rxlifecycle解决RxJava内存泄漏
关于
之前在写Retrofit+okhttp3请求网络的时候因为是异步请求所以因为异常销毁Activity/Fragment都容易造成内存泄露,这里记录一下通过rxlifecycle
,作者项目地址,此篇文章也会作为简易音乐博客系列的文章之一。
第一步,添加rxlifecycle引用
//rx生命周期
implementation 'com.trello:rxlifecycle:1.0'
implementation 'com.trello:rxlifecycle-components:1.0'
这里我没有复写源码的RXActivity,直接引用的:
public class RXHelper {
public static <T> ObservableTransformer<T, T> observableIO2Main(final RxActivity context) {
return upstream -> {
Observable<T> observable = upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
return composeContext(context, observable);
};
}
public static <T> ObservableTransformer<T, T> observableIO2Main(final RxFragment fragment) {
return upstream -> upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).compose(fragment.<T>bindToLifecycle());
}
public static <T> FlowableTransformer<T, T> flowableIO2Main() {
return upstream -> upstream
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
private static <T> ObservableSource<T> composeContext(Context context, Observable<T> observable) {
if(context instanceof RxActivity) {
//添加绑定生命周期,并在activity进入destory时解除订阅
return observable.compose(((RxActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
} else if(context instanceof RxFragmentActivity){
return observable.compose(((RxFragmentActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
}else if(context instanceof RxAppCompatActivity){
return observable.compose(((RxAppCompatActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
}else {
return observable;
}
}
}
使用
@Override
public void login(String phone, String password) {
mModel.login(phone, password)
//添加使用
.compose(RXHelper.observableIO2Main(App.getInstance()))
.subscribe(new Observer<Login_Bean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Login_Bean bean) {
mView.onLoginSuccess(bean);
}
@Override
public void onError(Throwable e) {
mView.onLoginFail(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
有问题欢迎批评指正,觉得不错的请点个赞┗|`O′|┛ 嗷~~
以上是关于Android使用Rxlifecycle解决RxJava内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
Android架构中添加AutoDispose解决RxJava内存泄漏