【问题标题】:Kotlin: Coroutine with Live Data or only Coroutines?Kotlin:带有实时数据的协程还是只有协程?
【发布时间】:2019-04-29 23:10:43
【问题描述】:
这两者哪个更好
1) 在 Viewmodel 中使用协程从网络中获取数据并使用实时数据更新 View?
2) 使用 View 中的协程调用 viewmodel 中的挂起函数,从网络中获取数据?
另一个问题
我们是否应该将 livedata 用于我们只需要从后端更新一次 UI 的用例,例如当用户在该屏幕上时数据不会改变
【问题讨论】:
标签:
android
kotlin
android-livedata
kotlinx.coroutines
【解决方案1】:
我投票支持 (1),使用 LiveData 将数据从 ViewModel 移动到视图的最后一步。
原因如下:如果您在 UI 中启动一个协程,该协程通过您的ViewModel...获取数据...
- 您最终会在视图中收到类似
getData() 的暂停呼叫。无论是Fragment 还是Activity,该协程都只会将结果传递给该特定实例。如果由于配置更改而重新创建,则需要在新实例中再次获取。
- 如果您正在处理协程的取消(您可能应该这样做),配置更改将意味着您已经在
ViewModel 和网络周围完成的任何工作都将丢失(例如,在一个长时间运行的网络调用),因为当你的视图被销毁时你的协程被取消。
- 如果您在 View 被销毁时没有取消协程,则您的数据提取函数可能会尝试更新 View 中的 UI,而该 View 完成后将不再存在。
相比之下,如果您在ViewModel 中启动协程,然后将结果放入LiveData:
- 由于 ViewModel 的生命周期更长,您的提取可以在配置更改后继续进行。
- 您可以在屏幕关闭时(在
onCleared 中)而不是在配置更改时取消协程。
-
LiveDataobservers 只会在 View 存在并且处于活动(前台)状态时被调用,因此当您的 View 没有准备好(或不再存在)时,您不必担心获得结果.
- 重新创建视图后,新实例可以开始观察
LiveData 并接收已加载的值。或者,如果您的数据仍在加载,它甚至最终会收到为之前的 View 实例启动的网络调用的结果。