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

时间:2018-11-28 05:33:53

标签: android kotlin android-livedata kotlinx.coroutines

这两个之间比较好

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

2)使用View中的协程调用从网络中获取数据的ViewModel中的暂停函数吗?

另一个问题

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

1 个答案:

答案 0 :(得分:7)

我支持(1),将LiveData用于将数据从ViewModel移至视图的最后一步。

这是为什么:如果您在用户界面中启动协程,该协程通过ViewModel ...

获取数据
  1. 您最终将在视图中遇到getData()之类的挂起电话。无论是Fragment还是Activity,该协程只会将结果传递给该特定实例。如果由于配置更改而重新创建了它,则需要在新实例中再次获取。
  2. 如果您要取消协程(可能应该这样做),则配置更改将意味着您在ViewModel和网络中已经完成的所有工作都会丢失(例如,长时间运行的网络通话的进度),因为在破坏视图后,协程将被取消。
  3. 如果在销毁View时不取消协程,则数据获取功能可能会尝试更新View中不再存在的View中的UI。

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

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