Android 关于LiveData的澄清';ViewModels中的强引用
ViewModel引用了以下内容: 警告:ViewModel决不能引用视图、生命周期或任何可能包含对活动上下文引用的类 接下来,LiveData文档说明: 只要给定的LifecycleOwner未被销毁,LiveData就会保留对观察者和所有者的强引用。当LiveData被销毁时,它会删除对观察者和所有者的引用 因此,如果我们在ViewModel中定义了一个LiveData变量,并且我们设置使用片段(或活动)作为所有者和/或观察者来观察它,这是否意味着我们违反了ViewModel文档中规定的规则?设置此类所有者/观察者的操作是否间接地将活动上下文引用放置在ViewModel中Android 关于LiveData的澄清';ViewModels中的强引用,android,android-livedata,android-viewmodel,Android,Android Livedata,Android Viewmodel,ViewModel引用了以下内容: 警告:ViewModel决不能引用视图、生命周期或任何可能包含对活动上下文引用的类 接下来,LiveData文档说明: 只要给定的LifecycleOwner未被销毁,LiveData就会保留对观察者和所有者的强引用。当LiveData被销毁时,它会删除对观察者和所有者的引用 因此,如果我们在ViewModel中定义了一个LiveData变量,并且我们设置使用片段(或活动)作为所有者和/或观察者来观察它,这是否意味着我们违反了ViewModel文档中规定的规则
LiveData文档似乎不应该引起关注,因为它会在需要时删除引用,但我想知道我是否遗漏了什么,因为文档本身似乎自相矛盾。我计划写一篇文章来解释您提出的问题。但我还没有发表。您可以在以下链接中阅读我的博客草稿: 或者给你一个简短的回答: LifecycleOwner:是一个只有一个方法的接口:getLifecyle()。此方法返回一个生命周期对象 生命周期:是一个具有状态并允许其他对象观察其状态更改的类 活动和片段:实现LifecycleOwner接口。在getLifecycle()方法中,我们将LifecycleRegistry对象作为Lifecycle返回。LifecycleRegister类扩展了Lifecycle类。此类帮助活动和片段通知观察者其状态更改 ObserverWrapper是LiveData中的一个内部类。此类将帮助LiveData了解LifecycleOwner的状态以及观察者拥有的数据的最新版本
LifecycleBoundObserver也是LiveData中的一个内部类。该类扩展了OberverWrapper,以向LiveData提供LifecycleOwner的状态,并保留观察者和观察者拥有的数据版本。它还实现了LifecycleEventObserver来观察生命周期的状态变化(在我们的例子中,它是活动的状态和片段的状态)。此类帮助LiveData了解活动(片段)的状态和观察者拥有的数据版本,因此LiveData可以决定是否将更新通知活动(片段)。ViewModel和LiveData具有不同的工作机制。LifeCycleOwner对象不是视图对象,因此lLİveData不引用任何视图对象。因此,ViewModel类中的LiveData对象没有问题。另一方面,您不能在ViewModel类中保留对任何类型的视图对象的引用,如TextView mTextView;setTextView(TextView TextView){mTextView=texView;}。这就是ViewModel文档的确切含义。