android - 澄清 LiveData 在 ViewModels 中的强引用
问题描述
ViewModel文档引用:
注意:ViewModel 绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类。
LiveData 文档接下来指出:
只要给定的 LifecycleOwner 未被破坏,LiveData 就会对观察者和所有者保持强引用。当它被销毁时,LiveData 会删除对观察者和所有者的引用。
因此,如果我们在 ViewModel 中定义了 LiveData 变量,并且我们设置使用片段(或活动)作为所有者和/或观察者来观察它,这是否意味着我们违反了 ViewModel 文档中所述的规则?设置这种类型的所有者/观察者的操作是否会间接在 ViewModel中放置一个 Activity 上下文引用?
LiveData 文档似乎不应该担心,因为它会在需要时删除引用,但我想知道我是否遗漏了一些东西,因为文档似乎自相矛盾。
解决方案
我打算写一篇文章来解释你问的问题。但我还没有发表。您可以在此链接中阅读我的草稿博客: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)有关更新。
推荐阅读
- spring-boot - 从属性文件中获取 fmt:formatDate 的模式
- c# - 从按钮调用整个脚本
- swift - 发送带有特定参数的图像?
- python - 填写 numpy ndarray 的最佳方法是什么?
- java - Java Spring + RabbitMQ + Docker 的奇怪问题
- javascript - JQuery Animate 函数不工作逗号/小数
- sql - 确定条目最少的人
- c# - 根据生成的一侧移动敌人精灵。时间:2019-04-01 标签:c#monogame
- django - 如何在 django 2.2 中删除 root 和包含 url 之间的未指定空间
- javascript - 突出显示 codemirror textarea 中的错误行