美文网首页RxJavaAndroid-RxJava
RxJava<第二十三篇>:RxJava内存泄漏问题

RxJava<第二十三篇>:RxJava内存泄漏问题

作者: NoBugException | 来源:发表于2019-03-27 13:50 被阅读16次
(1)存在内存泄漏问题

在使用rxjava的时候,如果没有及时解除订阅,在退出activity的时候,异步线程还在执行。对activity还存在引用,此时就会产生内存泄漏。

(2)常规手动取消订阅(不推荐)

为了防止内存泄漏的出现,我们需要在onDestroy取消订阅,代码如下:

            Observable.interval(1000, TimeUnit.MILLISECONDS)
                    .subscribe(new Observer<Long>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            disposable = d;
                        }

                        @Override
                        public void onNext(Long aLong) {

                        }

                        @Override
                        public void onError(Throwable e) {

                        }

                        @Override
                        public void onComplete() {

                        }
                    });
@Override
protected void onDestroy() {

    if(disposable != null && !disposable.isDisposed()){
        //取消订阅
        disposable.dispose();
    }
    super.onDestroy();
}

以上代码的缺点很明显:

必须在onSubscribe中保存Disposable对象,然后在onDestroy方法里面取消订阅,如果有多个Observable时,很明显Disposable也会有多个,这样代码看起来紊乱,逻辑复杂,可读性差。

那么有没有什么办法对Disposable统一管理呢?

(3)使用CompositeDisposable来管理Disposable

这篇文章大家可以看一下

Rxjava关于Disposable你应该知道的事

CompositeDisposable是一个存放Disposable的集合,它是一个容器,可以在BaseActivity里new一个CompositeDisposable对象,在BaseActivity的子类中可以使用该对象对Disposable统一管理。

CompositeDisposable也属于手动取消订阅,但显然比单独管理Disposable的方法强多了。

(4)RxLifecycle(自动取消订阅)(推荐)
  Observable
      .interval(1000, TimeUnit.MILLISECONDS)
      .compose(this.<Long>bindUntilEvent(ActivityEvent.DESTROY))
      .subscribe(new Consumer<Long>() {
          @Override
          public void accept(Long aLong) throws Exception {
          Log.d("aaa", String.valueOf(aLong));
          }
      });

RxLifecycle将Observable和Activity(Fragment)的生命周期绑定在一起,使用compose关键字来确定Observable将要在哪个生命周期执行时自动取消订阅。

具体请看这篇文章

RxJava<第二十一篇>:Android 第三方库RxLifecycle使用

这样优雅的解决RxJava内存泄漏问题值得推荐。

(5)AutoDispose(自动取消订阅)(推荐)
            Observable
                    .interval(1000, TimeUnit.MILLISECONDS)
                    //AutoDispose的关键语句
                    .as(AutoDispose.<Long>autoDisposable(AndroidLifecycleScopeProvider.from(this)))
                    .subscribe(new Consumer<Long>() {
                        @Override
                        public void accept(Long aLong) throws Exception {
                            Log.d("aaa", String.valueOf(aLong));
                        }
                    });

AutoDispose要比RxLifecycle更加简单,有人说使用AutoDispose取代RxLifecycle也是有一定道理的,毕竟RxLifecycle需要继承对应的RxActivityRxFragment,而AutoDispose却不用。

有关AutoDispose的描述,我也整理了一个博客。

RxJava<第二十二篇>:Android 第三方库AutoDispose使用

相关文章

网友评论

    本文标题:RxJava<第二十三篇>:RxJava内存泄漏问题

    本文链接:https://www.haomeiwen.com/subject/dvoavqtx.html