【问题标题】:Clarification about LiveData's strong references in ViewModels关于 ViewModel 中 LiveData 字符串引用的说明
【发布时间】:2021-04-20 08:41:07
【问题描述】:

ViewModel documentation 引用:

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

LiveData 文档接下来说明:

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

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

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

【问题讨论】:

  • ViewModel 和 LiveData 有不同的工作机制。 LifeCycleOwner 对象不是 View 对象,因此 lLİveData 不引用 View 对象。所以 ViewModel 类中的 LiveData 对象没有问题。另一方面,您不得在 ViewModel 类中保留对任何类型 View 对象的引用,例如 TextView mTextView; setTextView(TextView textView) { mTextView = texView; }。这正是 ViewModel 文档的含义。

标签: android android-livedata android-viewmodel


【解决方案1】:

我打算写一篇文章来解释你提出的问题。但我还没有发表。您可以在此链接中阅读我的草稿博客:Exploring LiveData in Android

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

Lifecycle:是一个有状态的类,允许其他对象观察它的状态变化。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2019-06-11
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2011-02-04
    相关资源
    最近更新 更多