美文网首页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