gpt4 book ai didi

java - 结合 RxJava 了解 Android 内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 16:33:25 27 4
gpt4 key购买 nike

我还是不明白内存泄漏是怎么出现的。

我知道如果被使用的东西(比如单例)持有对某物的引用,否则这个对象不能被垃圾回收并且可用内存下降。

但这会发生在什么范围内?我使用 RxBinding 从点击事件中创建和观察。范围是here它说:

Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe to free this reference.

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

最佳答案

When I set a manual listener as an anonymous inner class in onCreate it has a reference to to the activity, right? But why can't the whole activity-view-observable-subscription be garbage collected any more?

在这个简单的例子中,它可以被垃圾收集,你不应该有泄漏。

Why is [unsubscription] necessary?

这可能不是绝对必要的,就像您在上面给出的示例中那样。正如文档所述,这只是一个您应该注意的警告。但是,这是一个值得遵循的好习惯。

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

RxViews.clicks(clickableView)
.flatMap(view -> getDataFromApi()
.subscribe(data -> onDataLoaded(data));

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

关于java - 结合 RxJava 了解 Android 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34229365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com