Kotlin:使用实时数据或只有协同程序的协同程序?

Sou*_*ldi 4 android kotlin android-livedata kotlinx.coroutines

这两者之间哪个更好

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

2)使用View中的coroutine来调用viewmodel中的suspend函数,该函数从网络中获取数据?

另一个问题

我们是否应该将livingata用于需要从后端仅更新一次UI的用例,就像用户在该屏幕上时数据不会改变一样

zsm*_*b13 8

我投票给(1),LiveData用于将数据从ViewModel视图移动到最后一步.

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

  1. 你最终会像getData()在View中一样暂停调用.无论是一个Fragment还是一个Activity,该协程将仅将结果传递给该特定实例.如果由于配置更改而重新创建,则需要在新实例中再次获取.
  2. 如果您正在处理协程的取消(您可能应该这样做),配置更改将意味着您已经在ViewModel网络中和网络周围完成的任何工作都将丢失(例如,长时间运行的网络呼叫的任何进度) ,因为当你的View被销毁时你的协程被取消了.
  3. 如果在销毁View时未取消协同程序,则数据提取功能可能会尝试更新视图中的UI,如果完成时不再存在.

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

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