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<T extends BaseContract.BaseView> {

        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 <T>
         * @return
         */
        <T> LifecycleTransformer<T> bindToLife();

    }
}

4.使用操作

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

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

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

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

感谢参考文章:

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容