【发布时间】:2020-03-08 01:36:28
【问题描述】:
这个问题是关于在 Android 编程中使用 MVVM、LiveData、Room(因此也包括 RetroFit)和协程的最佳实践。最佳实践之一指出
网络或数据库调用等长时间运行的执行应与 UI 线程异步执行。
当前的文档和博客详细解释了如何使用协同例程执行此操作,并且一些示例很好地证明了这一点,例如Sunflower App。
我缺少的部分是当 ViewModel 被初始化并且它需要显示来自数据库/存储库/网络的内容时,如何使用协同程序进行加载。在Sunflower App 中,存储库正在返回 LiveData,但没有使用协程。
例子:
在PlantDao 我们看到:
@Query("SELECT * FROM plants WHERE id = :plantId")
fun getPlant(plantId: String): LiveData<Plant>
因此没有suspend 关键字,这不是协同程序的一部分。
在plantRepository 中有:
fun getPlant(plantId: String) = plantDao.getPlant(plantId)
再次没有suspend关键字所以没有协程。
在PlantDetailViewModel中初始化向我们展示了
val plant = plantRepository.getPlant(plantId)
所以没有范围、工作或任何与协同程序相关的东西。
我的问题:
- 房间执行数据库查询是异步的吗?如果是,是否使用协同程序?
- 这是一个好习惯吗?因为repo只返回LiveData,只能用来返回LiveData
- 还有哪些其他策略可以做到这一点?有什么例子吗?
- 此策略对于网络请求会有所不同吗?
【问题讨论】:
标签: android mvvm android-room android-livedata kotlin-coroutines