gpt4 book ai didi

android - 我长寿的LifeCycleOwner一直观察LiveData会不会造成资源泄露?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:41 24 4
gpt4 key购买 nike

在某些情况下,例如 Home Widget (AppWidgetProvider),我无权访问 ActivityFragment

通常,我使用ProcessLifecycleOwner.get(),或者下面的LifeCycleOwner来观察LiveData

public enum ForeverStartLifecycleOwner implements LifecycleOwner {
INSTANCE;

private final LifecycleRegistry mLifecycleRegistry;

ForeverStartLifecycleOwner() {
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}

@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}

在大多数情况下,在 LiveData 的回调中,我会尝试通过使用 从进一步观察 LiveData 中删除 LifeCycleOwner liveData.removeObserver.

但是,有些情况

  1. LiveData 触发回调失败。
  2. 因此,我没有在 LiveData 的回调中从 LiveData 中删除 LifeCycleOwner。

在这种情况下,会不会造成资源泄露?例如,GC 注意到一个长生命周期的 LifeCycleOwner 正在观察 LiveData A。尽管 LiveData A 已经超出范围,但 GC 不会释放 LiveData A,因为长期存在的 LifeCycleObserver 仍在观察它?

如果是这样,我该如何解决这种泄漏?

最佳答案

will it cause resource leakage?

回答:我不认为这种情况会导致内存泄漏。

为什么?

因为,正如我们所见,一旦 LiveData 超出任何 LifecyclerOwner 的范围,如果您将 LifecycleOwner 设置为DESTROYED 状态。

查看observe()方法文档;


obesrve() :

Adds the given observer to the observers list within the lifespan of the given owner. The events are dispatched on the main thread. If LiveData already has data set, it will be delivered to the observer.

The observer will only receive events if the owner is in STARTED or RESUMED state (active).

If the owner moves to the DESTROYED state, the observer will automatically be removed.

When data changes while the owner is not active, it will not receive any updates. If it becomes active again, it will receive the last available data automatically.

LiveData keeps a strong reference to the observer and the owner as long as the given LifecycleOwner is not destroyed. When it is destroyed, LiveData removes references to the observer & the owner.

If the given owner is already in DESTROYED state, LiveData ignores the call.

If the given owner, observer tuple is already in the list, the call is ignored. If the observer is already in the list with another owner, LiveData throws an IllegalArgumentException.


长话短说

因此,根据上述文档,从行开始:

  • 如果所有者移动到 DESTROYED 状态,则观察者将自动被移除。

  • 如果给定的所有者已经处于 DESTROYED 状态,LiveData 忽略电话。

很明显,如果您的 LifecycleOwner 没有范围(已经处于 DESTROYED 状态),那么 LiveData 会删除它的强引用,因此没有机会内存泄漏。


how can I resolve this kind of leakage? & get callback all the time:

回答:您已经创建了自己的LifecycleOwner,所以我建议您自己处理。让您的 LiveData 成为 observeForever() 并在您的 LifecycleOwner 之后自行处理移除(removeObserver()) 达到 DESTROYED 状态。

这不会导致内存泄漏。因为它在文档中说明:(这意味着给定的观察者将接收所有事件并且永远不会被自动删除)

observeForever() :

Adds the given observer to the observers list. This call is similar to observe(LifecycleOwner, Observer) with a LifecycleOwner, which is always active. This means that the given observer will receive all events and will never be automatically removed. You should manually call removeObserver(Observer) to stop observing this LiveData. While LiveData has one of such observers, it will be considered as active.

If the observer was already added with an owner to this LiveData, LiveData throws an IllegalArgumentException.

这将帮助您始终接收回调,您只需要处理完成后如何删除回调。

希望对您有所帮助!

关于android - 我长寿的LifeCycleOwner一直观察LiveData会不会造成资源泄露?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52621354/

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