(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
这篇文章大家可以看一下
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需要继承对应的RxActivity
、RxFragment
,而AutoDispose却不用。
有关AutoDispose的描述,我也整理了一个博客。
网友评论