RxJava内存泄露

2018-11-26  本文已影响0人  董成鹏

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中对于外部类成员变量的引用.

上一篇 下一篇

猜你喜欢

热点阅读