RxJava内存泄漏
考虑下面的代码
subscription = recommendMovieUseCase.recommendRandomMovie()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String movieTitle) {
view.hideProgress();
view.showTitle(movieTitle);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
view.hideProgress();
view.showLoadingError();
}
});
在上面的代码中, 即使我们调用了subscription.unsubscribe()方法, 还是会造成内存泄露, 这是因为我们知道内部类会隐式的持有外部类的引用, 而unsubscribe()方法, 会切断这种隐式的引用, 这在一般情况下是没有问题的.
但是上面的例子中, 内部类不仅仅持有外部类的引用, 还持有了view的引用, unsubscribe()方法是不会切断这种引用的, 所以会造成内存泄露.
那上面的问题怎么解决?
就是不用unsubscribe()方法, 使用empty()方法, 后者会把会把内部类中对于外部类成员的引用也置为空.
对于CompositeSubscription来说, 我们要调用clear方法, 这样才能切断每一个Subscription中对于外部类成员变量的引用.












网友评论