【发布时间】:2020-06-27 10:01:47
【问题描述】:
假设在 VM 中使用 viewModelScope 启动了一个新的协程,并在通用存储库类中调用了一个非挂起函数
UserViewModel
viewModelScope.launch(context = Dispatchers.IO) {
_user.value?.id?.let { id ->
val dataSaved = userRepository.setUserData(id, newUser)
}
}
UserRepository
fun setUserData(id: String, data: User): Boolean {
return try {
val saveTask = db.collection(COLLECTION).document(id).set(data)
Tasks.await(saveTask)
true
} catch (e: Throwable) {
false
}
}
-
setUserData的启动范围和背景是什么? - 如果我在
setUserData函数之前添加suspend键,Tasks的await方法将生成一个警告说Inappropriate blocking method call。为什么? - 这个实现有什么不同?
suspend fun setUserData(id: String, data: User): Boolean {
return coroutineScope {
return@coroutineScope try {
val saveTask = db.collection(COLLECTION).document(id).set(data)
Tasks.await(saveTask)
true
} catch (e: Throwable) {
e.printStackTrace()
Log.e(TAG, "${e.message}")
false
}
}
}
-
coroutineScope是否保证setUserData将在调用者的相同范围和上下文中启动?
【问题讨论】:
标签: android scope android-context coroutine kotlin-coroutines