Kotlin:带实时数据的协程还是只有协程?

Kotlin: Coroutine with Live Data or only Coroutines?

这两个哪个更好

1) 在 Viewmodel 中使用协程从网络中获取数据并使用实时数据更新视图?

2) 使用视图中的协程调用视图模型中从网络获取数据的挂起函数?

另一个问题

我们是否应该在需要从后端更新 UI 一次的用例中使用实时数据,比如当用户在该屏幕上时数据不会更改

我投票赞成 (1),在将数据从 ViewModel 移动到视图的最后一步中使用 LiveData

原因如下:如果您在 UI 中启动协程,它通过您的 ViewModel...

获取数据
  1. 您最终会在视图中看到类似 getData() 的暂停调用。无论是 Fragment 还是 Activity,该协程都只会将结果传递给该特定实例。如果由于配置更改而重新创建,您将需要在新实例中再次获取。
  2. 如果您正在处理协程的取消(您可能应该这样做),配置更改将意味着您已经在 ViewModel 和网络中完成的所有工作都将丢失(例如,长 运行 网络调用的任何进展),因为当您的视图被销毁时,您的协程被取消。
  3. 如果您在视图被销毁时没有取消协程,您的数据获取函数可能会尝试更新视图中的 UI,如果视图完成时不再存在。

相比之下,如果您在 ViewModel 中启动协程,然后将结果放入 LiveData:

  1. 由于 ViewModel 的使用寿命更长,您的提取可以在配置更改时继续。
  2. 您可以在屏幕永久关闭时(在 onCleared 中)而不是在配置更改时取消协程。
  3. LiveData 仅当 View 存在且处于活动(前台)状态时才会调用观察者,因此您不必担心在 View 尚未准备好时获取结果(或不再存在)。
  4. 重新创建视图后,新实例可以开始观察 LiveData 并接收已加载的值。或者,如果您的数据仍在加载,它甚至最终会收到为之前的 View 实例启动的网络调用的结果。