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