我仍然不明白内存泄漏是如何出现的。
我知道如果使用的东西(比如一个单例)持有对sth的引用,则该对象不能被垃圾收集并且可用内存会关闭。
但是在这种情况下会发生什么?我使用RxBinding从单击事件创建和Observable。 范围是here,它说:
警告:创建的observable保留了对{@code view}的强引用。退订 免费提供此参考资料。
为什么这有必要? 当我在onCreate中将手动监听器设置为匿名内部类时,它会引用该活动,对吧?但是为什么整个activity-view-observable-subscription不能再被垃圾收集呢?
答案 0 :(得分:5)
当我在onCreate中将手动监听器设置为匿名内部类时,它会引用该活动,对吧?但是为什么整个activity-view-observable-subscription不能再被垃圾收集呢?
在这种简单的情况下,它可以被垃圾收集,你不应该有泄漏。
为什么需要[取消订阅]?
可能没有必要,如上面给出的例子。正如文档所述,这只是一个警告,你应该知道。但是,这是一个很好的做法。
问题是您可能在Rx链中执行其他任务,这些任务可能会导致与RxBinding调用一起泄漏。例如:
RxViews.clicks(clickableView)
.flatMap(view -> getDataFromApi()
.subscribe(data -> onDataLoaded(data));
在这种情况下,当使用另一个Observable单击按钮时,我们将从API获取数据。 Observable仍然引用了Click Observable,因此在我们的API调用返回之前,引用的View不能被垃圾收集(可能永远不会)。