我仍然不明白内存泄漏是如何出现的。
我知道,如果使用的东西(如单例)包含对其他东西的引用,则该对象不能被垃圾回收,并且可用内存会下降。
但是在什么范围内会发生这种情况?我使用RxBind从点击事件创建和观察。范围在这里,它说:
警告:创建的可观察对象保留对{@code view}的强引用。取消订阅以释放此引用。
为什么这是必要的?当我在onCreate中将手动侦听器设置为匿名内部类时,它有一个对活动的引用,对吗?但是为什么不能再对整个活动-视图-可观察-订阅进行垃圾收集呢?
当我在onCreate中将手动侦听器设置为匿名内部类时,它有一个对活动的引用,对吗?但是为什么不能再对整个活动-视图-可观察-订阅进行垃圾收集呢?
在这个简单的例子中,它可以被垃圾收集,你不应该有泄漏。
为什么需要[取消订阅]?
这可能不是绝对必要的,就像你上面给出的例子一样。正如留档所说,这只是一个你应该意识到的警告。然而,这是一个很好的做法。
问题是您可能正在执行Rx链中的其他任务,这些任务可能会与RxBind调用一起导致泄漏。例如:
RxViews.clicks(clickableView)
.flatMap(view -> getDataFromApi()
.subscribe(data -> onDataLoaded(data));
在这种情况下,当使用另一个可观察对象单击按钮时,我们从API中获取数据。该可观察对象仍然具有对单击可观察对象的引用,因此引用的视图不能被垃圾回收,直到我们的API调用返回(这可能永远不会)。