android - 即使 LiveData 只会更新一次,也从 Coroutine 发布到 LiveData 以更新 UI
问题描述
在我的 ViewModel 的构造函数中,我立即启动了一个协程来进行一次性网络调用。为了根据这个网络调用的结果更新 UI,我在我的 ViewModel 中发布了一些 LiveData 变量的更新。这些 LiveData 变量依次由片段观察,然后进行必要的 UI 更新。
我想知道这是否是从协程进行 UI 更新的有效方法。正如我之前提到的,网络请求在初始化时只是一次完成,因此 LiveData 变量永远不会被更新超过一次。那么在我的片段中设置观察者是不是很浪费,因为我知道他们只会被调用一次?如果是这样,有什么更好的方法来做到这一点?
谢谢!
解决方案
那么在我的片段中设置观察者是不是很浪费,因为我知道他们只会被调用一次?
他们可能会被多次调用。
首先,LiveData
是价值持有者。并且,具体来说,通过LiveData
在 a 中,您可以在配置更改(屏幕旋转、暗模式切换等)中ViewModel
保留和保持的值。LiveData
因此,流程可能会变成:
- 您的片段已创建
- 您的视图模型已创建并且您启动了网络 I/O
- 你的片段实例化了它的 UI
- 您的片段观察到
LiveData
- 您的协程完成并且您的视图模型更新
LiveData
- 您的片段从 接收值
LiveData
并更新 UI - 用户扭动手腕并旋转屏幕
- 你的片段被破坏了
- 您的替换片段已创建
- 您的视图模型被保留,并且您的替换片段获得具有相同视图模型的相同视图模型
LiveData
- 你的替换片段实例化了它的 UI
- 您的替换片段观察到
LiveData
- 您的替换片段从 接收值
LiveData
并更新 UI
因此,您所描述的通常是合理的。
推荐阅读
- android - 房间 android 数据库被锁定
- python - 发送键和弦以打开新标签 Selenium Python
- php - 如何在fpdf中将1个表格数据显示为2列,每个数据1-n?
- css - 使用 css 在 Wordpress/Elementor 中更改单个菜单项的文本颜色
- arm - gem5 ARM bigLITTLE 模拟器的非对称缓存配置
- javascript - JavaScript - 获取编码 URI 的 url 参数
- python-3.x - 如何定义一个函数来自动复制一个类并在没有输入参数的情况下删除它们?
- c - 在 Objective-C(或 C)中,这个带有 bool 指针的代码是如何工作的?
- c++ - 失踪
安装gtkmm后的头文件 - forms - 如何使用 SaveToDatabaseFinisher 和 TYPO3 EXT:Form 存储当前页面的 pid