首页 > 解决方案 > 澄清 LiveData 在 ViewModels 中的强引用

问题描述

ViewModel文档引用:

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

LiveData 文档接下来指出:

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

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

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

标签: androidandroid-livedataandroid-viewmodel

解决方案


我打算写一篇文章来解释你问的问题。但我还没有发表。您可以在此链接中阅读我的草稿博客: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)有关更新。


推荐阅读