从协程发布到 LiveData 以更新 UI 即使 LiveData 只会更新一次
Posting to LiveData from Coroutine to Update UI even if LiveData Will Only Update Once
在我的 ViewModel 的构造函数中,我立即启动协程来进行一次性网络调用。为了根据此网络调用的结果更新 UI,我 post 更新了我的 ViewModel 中的几个 LiveData 变量。这些 LiveData 变量依次被片段观察,然后进行必要的 UI 更新。
我想知道这是否是从协程进行 UI 更新的有效方法。正如我之前提到的,网络请求仅在初始化时完成一次,因此 LiveData 变量永远不会更新超过一次。因为我知道他们只会被调用一次,所以在我的片段中设置观察者是不是很浪费?如果是这样,执行此操作的更好方法是什么?
谢谢!
Is it then wasteful to set up observers in my fragment since I know for a fact they will only be called once?
他们可能被调用不止一次。
首先,LiveData
是价值持有者。并且,具体来说,通过在 ViewModel
中使用 LiveData
,您可以保留 LiveData
和在配置更改(屏幕旋转、暗模式切换等)中保持的值。
所以,流程最终可能是:
- 您的片段已创建
- 您的视图模型已创建,您启动网络 I/O
- 您的片段实例化了它的 UI
- 您的片段观察到
LiveData
- 您的协程完成并且您的视图模型更新
LiveData
- 您的片段从
LiveData
接收值并更新 UI
- 用户转动手腕并旋转屏幕
- 您的碎片已销毁
- 您的替换片段已创建
- 您的视图模型 被保留,并且您的替换片段获得具有相同
LiveData
的相同视图模型
- 您的替换片段实例化了它的 UI
- 您的替换片段观察到
LiveData
- 您的替换片段从
LiveData
接收值并更新 UI
所以,你的描述大体上是合理的。
在我的 ViewModel 的构造函数中,我立即启动协程来进行一次性网络调用。为了根据此网络调用的结果更新 UI,我 post 更新了我的 ViewModel 中的几个 LiveData 变量。这些 LiveData 变量依次被片段观察,然后进行必要的 UI 更新。
我想知道这是否是从协程进行 UI 更新的有效方法。正如我之前提到的,网络请求仅在初始化时完成一次,因此 LiveData 变量永远不会更新超过一次。因为我知道他们只会被调用一次,所以在我的片段中设置观察者是不是很浪费?如果是这样,执行此操作的更好方法是什么?
谢谢!
Is it then wasteful to set up observers in my fragment since I know for a fact they will only be called once?
他们可能被调用不止一次。
首先,LiveData
是价值持有者。并且,具体来说,通过在 ViewModel
中使用 LiveData
,您可以保留 LiveData
和在配置更改(屏幕旋转、暗模式切换等)中保持的值。
所以,流程最终可能是:
- 您的片段已创建
- 您的视图模型已创建,您启动网络 I/O
- 您的片段实例化了它的 UI
- 您的片段观察到
LiveData
- 您的协程完成并且您的视图模型更新
LiveData
- 您的片段从
LiveData
接收值并更新 UI - 用户转动手腕并旋转屏幕
- 您的碎片已销毁
- 您的替换片段已创建
- 您的视图模型 被保留,并且您的替换片段获得具有相同
LiveData
的相同视图模型
- 您的替换片段实例化了它的 UI
- 您的替换片段观察到
LiveData
- 您的替换片段从
LiveData
接收值并更新 UI
所以,你的描述大体上是合理的。