rx android 内存泄露,Rx系列<第二十三篇>:RxJava内存泄漏问题解决

(1)存在内存泄漏问题

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

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

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

Observable.interval(1000, TimeUnit.MILLISECONDS)

.subscribe(new Observer() {

@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

这篇文章大家可以看一下

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

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

(4)RxLifecycle(自动取消订阅)(推荐)

Observable

.interval(1000, TimeUnit.MILLISECONDS)

.compose(this.bindUntilEvent(ActivityEvent.DESTROY))

.subscribe(new Consumer() {

@Override

public void accept(Long aLong) throws Exception {

Log.d("aaa", String.valueOf(aLong));

}

});

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

具体请看这篇文章

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

(5)AutoDispose(自动取消订阅)(推荐)

Observable

.interval(1000, TimeUnit.MILLISECONDS)

//AutoDispose的关键语句

.as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(this)))

.subscribe(new Consumer() {

@Override

public void accept(Long aLong) throws Exception {

Log.d("aaa", String.valueOf(aLong));

}

});

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值