RxJava内存泄露解决-RxLifecycle

Rxjava在Android开发中使用已经是老生常谈了,但如果使用不当会导致内存泄露

比如,使用RxJava发布一个订阅后,当Activity被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity无法被回收,从而引发内存泄漏。

这里推荐一个开源库RxLifecycle,通过监听Activity、Fragment的生命周期,来自动断开subscription以防止内存泄露

那么如何使用呢

1、添加依赖

在build.gradle中添加以下依赖

implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'

// If you want to bind to Android-specific lifecycles
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'

// If you want pre-written Activities and Fragments you can subclass as providers
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'

2.配置Activity、Fragment

Activity/Fragment继承RxAppCompatActivity/RxFragment,一般在开发中都是BaseActivity/BaseFragment来分别继承这两个类。

当然RxLifecycle还支持其他更多的组件

rxlifecycle.png

3、使用compose操作符绑定容器生命周期

这里推荐用MVP模式来绑定生命周期,代码如下:

public interface BaseContract {

    interface BasePresenter {

        void attachView(T view);

        void detachView();
    }


    interface BaseView {

        //显示进度中
        void showLoading();

        //隐藏进度
        void hideLoading();

        //显示请求成功
        void showSuccess(String message);

        //失败重试
        void showFaild(String message);

        //显示当前网络不可用
        void showNoNet();

        //重试
        void onRetry();

        /**
         * 绑定生命周期
         *
         * @param 
         * @return
         */
         LifecycleTransformer bindToLife();

    }
}

4.使用操作

下面使用登录的代码来做个例子:

public class LoginPresenter extends BasePresenter implements LoginContract.Presenter {
    @Inject
    public LoginPresenter() {
    }

    @Override
    public void login(String username, String password) {
        RetrofitManager.create(ApiService.class)
                .login(username, password)
                .compose(RxSchedulers.>applySchedulers())
                .compose(mView.>bindToLife())
                .subscribe(new Consumer>() {
                    @Override
                    public void accept(DataResponse response) throws Exception {
                        if (response.getErrorCode() == 0) {
                            mView.loginSuccess(response.getData());
                        } else {
                            mView.showFaild(String.valueOf(response.getErrorMsg()));
                        }
                    }
                }, new Consumer() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        mView.showFaild(throwable.getMessage());
                    }
                });
    }
}

好吧,使用起来就是这么简单,不过目前似乎有大神研究出了更好的Rxjava内存泄露解决方案,有兴趣的可以自行了解下

感谢参考文章:

Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

你可能感兴趣的:(RxJava内存泄露解决-RxLifecycle)