在Activity中使用Android中的lambda会导致内存泄漏吗?

时间:2017-06-09 09:49:13

标签: android lambda memory-leaks rx-java

我正在看这个演讲,在13:42他们说在路上使用lambda:

enter image description here

api.getEvents()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnSubscribe(() -> loadingIndication.show())
    .doOnUnsubscribe(() -> loadingIndication.hide())
    .subscribe(...);

导致View泄露。

在这种情况下,你能解释一下泄漏是如何起作用的吗?是否出现泄漏取决于我们如何编译代码以及我们将RxJava代码放在哪个类中(例如,在Activity中,在Application中,在Service中)?

1 个答案:

答案 0 :(得分:1)

这导致泄漏,因为lambdas与匿名内部类没有什么不同,在匿名内部类中,lambdas将隐藏引用它们被调用的当前类,在本例中是Activity。所以这段代码实际上引用了你的Activity。

api.getEvents()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnSubscribe(() -> loadingIndication.show())
    .doOnUnsubscribe(() -> loadingIndication.hide())
    .subscribe(events -> {}, throwable -> {});

我没有时间检查视频,但有一种方法可以使用CompositeDisposable并通过{{添加上述代码返回的Disposable来处理此类可能的内存泄漏1}}并在您的活动compositeDisposable.add()上调用compositeDisposable.clear()