澄清 LiveData 在 ViewModels 中的强力引用



ViewModel文档引用:

注意:ViewModel决不能引用视图、生命周期或任何可能引用活动上下文的类。

LiveData文档接下来指出:

只要给定的LifecycleOwner没有被破坏,LiveData就会保留对观察者和所有者的强引用。当它被销毁时,LiveData会删除对observer&所有者。

因此,如果我们在ViewModel中定义了LiveData变量,并且我们设置为使用片段(或活动(作为所有者和/或观察者来观察它,这是否意味着我们违反了ViewModel文档中规定的规则?设置此类所有者/观察者的操作是否间接地将活动上下文引用放置在ViewModel中?

根据LiveData文档,这似乎不应该是一个问题,因为它会在需要时删除引用,但我想知道我是否遗漏了什么,因为文档似乎自相矛盾。

我计划写一篇文章来解释你问的问题。但我还没有发表它。你可以在这个链接中阅读我的博客草稿:探索Android 中的LiveData

或者简短的回答:LifecycleOwner:是一个只有一个方法的接口:getLifecyle((。此方法返回一个Lifecycle对象。

生命周期:是一个具有状态并允许其他对象观察其状态变化的类。

Activity和Fragment:实现LifecycleOwner接口。在getLifecycle((方法中,我们返回一个LifecycleRegistry对象作为Lifecycle。LifecycleRegister类扩展了Lifecycle类。这个类帮助Activity和Fragment通知观察者它们的状态更改。

ObserverWrapper是LiveData中的一个内部类。此类将帮助LiveData了解LifecycleOwner的状态以及Observer拥有的最新版本的数据。

LifecycleBoundObserver也是LiveData中的一个内部类。该类扩展OberverWrapper,为LiveData提供LifecycleOwner的状态,并保留Observer和Observer所拥有的数据版本。它还实现了LifecycleEventObserver来观察Lifecycle的状态变化(在我们的例子中,它是Activity的状态和Fragment的状态(。这个类帮助LiveData了解活动(片段(的状态和观察者所拥有的数据版本,因此LiveData可以决定是否将更新通知活动(碎片(。

相关内容

  • 没有找到相关文章

最新更新