【问题标题】:Understanding Android Memory Leaks in combination with RxJava结合 RxJava 理解 Android 内存泄漏
【发布时间】:2023-03-18 10:25:01
【问题描述】:
我还是不明白内存泄漏是怎么出现的。
我知道如果使用的东西(比如单例)持有对某物的引用,否则该对象不能被垃圾收集并且可用内存下降。
但这发生在什么范围内?我使用 RxBinding 从点击事件中创建和 Observable。
范围是here,上面写着:
警告: 创建的 observable 保持对 {@code view} 的强引用。退订
释放这个引用。
为什么这是必要的?
当我在 onCreate 中将手动侦听器设置为匿名内部类时,它具有对活动的引用,对吗?但是为什么不能再对整个活动视图可观察订阅进行垃圾回收呢?
【问题讨论】:
标签:
java
android
memory-leaks
rx-java
rx-android
【解决方案1】:
当我在 onCreate 中将手动侦听器设置为匿名内部类时,它具有对活动的引用,对吗?但是为什么不能再对整个活动视图可观察订阅进行垃圾回收呢?
在这个简单的例子中,它可以被垃圾回收,你不应该有泄漏。
为什么需要[取消订阅]?
这可能不是绝对必要的,就像你上面给出的例子一样。正如文档所述,这只是一个您应该注意的警告。不过,这是一个很好的做法。
问题是您可能正在执行 Rx 链中的其他任务,这些任务可能与 RxBinding 调用一起导致泄漏。例如:
RxViews.clicks(clickableView)
.flatMap(view -> getDataFromApi()
.subscribe(data -> onDataLoaded(data));
在这种情况下,当使用另一个 Observable 单击按钮时,我们会从 API 获取数据。该 Observable 仍然具有对 click Observable 的引用,因此在我们的 API 调用返回之前(可能永远不会),引用的 View 不能被垃圾收集。