与RxJava结合了解Android内存泄漏

Pau*_*hek 2 java android memory-leaks rx-java rx-android

我仍然不明白内存泄漏是如何出现的.

我知道如果使用的东西(如单例)持有对其他的引用,则此对象不能被垃圾收集并且可用内存会关闭.

但是在这种情况下会发生什么?我使用RxBinding从单击事件创建和Observable.范围在这里,它说:

警告:创建的observable保留对{@code view}的强引用.取消订阅以免费提供此参考.

为什么这有必要?当我在onCreate中将手动监听器设置为匿名内部类时,它会引用该活动,对吧?但为什么整个activity-view-observable-subscription不能再被垃圾收集?

Tan*_*.7x 5

当我在onCreate中将手动监听器设置为匿名内部类时,它会引用该活动,对吧?但为什么整个activity-view-observable-subscription不能再被垃圾收集?

在这个简单的情况下,它可以被垃圾收集,你不应该有泄漏.

为什么需要[取消订阅]?

它可能不是绝对必要的,如上面给出的示例.正如文档所述,这只是一个警告,你应该知道.但是,这是一个很好的做法.

问题是您可能在Rx链中执行其他任务,这些任务可能会导致与RxBinding调用组合的泄漏.例如:

RxViews.clicks(clickableView)
    .flatMap(view -> getDataFromApi()
    .subscribe(data -> onDataLoaded(data));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当使用另一个Observable单击按钮时,我们将从API获取数据.Observable仍然引用了Click Observable,因此在我们的API调用返回之前,引用的View不能被垃圾收集(可能永远不会).