与RxJava结合了解Android内存泄漏

时间:2015-12-11 17:38:14

标签: java android memory-leaks rx-java rx-android

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

我知道如果使用的东西(比如一个单例)持有对sth的引用,则该对象不能被垃圾收集并且可用内存会关闭。

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

  

警告:创建的observable保留了对{@code view}的强引用。退订       免费提供此参考资料。

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

1 个答案:

答案 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不能被垃圾收集(可能永远不会)。