【发布时间】:2019-04-27 14:23:35
【问题描述】:
我有一个用例,我想使用协程,但有点困惑如何实现它。
具有范围并绑定到 UI 生命周期并从存储库调用 API 的 ViewModel:
class UserViewModel(): CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun showUser() {
launch {
val user = repo.getUser()
livedata = user
}
}
fun onClean() {
job.cancel()
}
}
存储库使用协程来构建网络调用,如下所示:
suspend fun getUser() = GlobalScope { ... }
用例是,一旦从 ViewModel 调用 API,就需要始终完全执行存储库功能,因为我们需要捕获来自服务器的所有网络响应。
如何确保存储库中的协程始终执行但 ViewModel 协程将被取消以避免视图模型被清除后的内存泄漏?
【问题讨论】:
-
为什么必须完成
getUser操作?它是只读的。 -
getUser 正在执行网络请求,但无论在 viewmodel 中如何处理响应,我们都需要捕获所有异常并在必要时在此函数中改变应用状态
标签: android kotlin kotlin-coroutines coroutine coroutinescope