首页 > 解决方案 > 即使 LiveData 只会更新一次,也从 Coroutine 发布到 LiveData 以更新 UI

问题描述

在我的 ViewModel 的构造函数中,我立即启动了一个协程来进行一次性网络调用。为了根据这个网络调用的结果更新 UI,我在我的 ViewModel 中发布了一些 LiveData 变量的更新。这些 LiveData 变量依次由片段观察,然后进行必要的 UI 更新。

我想知道这是否是从协程进行 UI 更新的有效方法。正如我之前提到的,网络请求在初始化时只是一次完成,因此 LiveData 变量永远不会被更新超过一次。那么在我的片段中设置观察者是不是很浪费,因为我知道他们只会被调用一次?如果是这样,有什么更好的方法来做到这一点?

谢谢!

标签: androidkotlinviewmodel

解决方案


那么在我的片段中设置观察者是不是很浪费,因为我知道他们只会被调用一次?

他们可能会被多次调用。

首先,LiveData是价值持有者。并且,具体来说,通过LiveData在 a 中,您可以在配置更改(屏幕旋转、暗模式切换等)中ViewModel保留和保持的值。LiveData

因此,流程可能会变成:

  • 您的片段已创建
  • 您的视图模型已创建并且您启动了网络 I/O
  • 你的片段实例化了它的 UI
  • 您的片段观察到LiveData
  • 您的协程完成并且您的视图模型更新LiveData
  • 您的片段从 接收值LiveData并更新 UI
  • 用户扭动手腕并旋转屏幕
  • 你的片段被破坏了
  • 您的替换片段已创建
  • 您的视图模型被保留,并且您的替换片段获得具有相同视图模型的相同视图模型LiveData
  • 你的替换片段实例化了它的 UI
  • 您的替换片段观察到LiveData
  • 您的替换片段从 接收值LiveData并更新 UI

因此,您所描述的通常是合理的。


推荐阅读