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 第三方库RxLifecycle使用

Android架构中添加AutoDispose解决RxJava内存泄漏

retrofit2+MVP+rxjava2+rxlifecycle2 为啥无法解决内存泄露

RxJava中常用的库

text RxJ使运营商扁平化

RxJava2+Retrofit2+RxLifecycle2使用MVP模式构建项目