Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 关于LiveData的澄清';ViewModels中的强引用_Android_Android Livedata_Android Viewmodel - Fatal编程技术网

Android 关于LiveData的澄清';ViewModels中的强引用

Android 关于LiveData的澄清';ViewModels中的强引用,android,android-livedata,android-viewmodel,Android,Android Livedata,Android Viewmodel,ViewModel引用了以下内容: 警告:ViewModel决不能引用视图、生命周期或任何可能包含对活动上下文引用的类 接下来,LiveData文档说明: 只要给定的LifecycleOwner未被销毁,LiveData就会保留对观察者和所有者的强引用。当LiveData被销毁时,它会删除对观察者和所有者的引用 因此,如果我们在ViewModel中定义了一个LiveData变量,并且我们设置使用片段(或活动)作为所有者和/或观察者来观察它,这是否意味着我们违反了ViewModel文档中规定的规则

ViewModel引用了以下内容:

警告:ViewModel决不能引用视图、生命周期或任何可能包含对活动上下文引用的类

接下来,LiveData文档说明:

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

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