【问题标题】: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 不能被垃圾收集。

    【讨论】: