调用my的saveUser()后,Firestore文档将被成功更新,但协同作业会被取消,捕捉到一个JobCancellationException,并且日志"User #${user.id} saved !"永远不会被打印。这个取消是从哪里来的?它怎么才能完成呢?
// ViewModel.kt
fun saveUser(user: User) {
viewModelScope.launch(Dispatchers.IO) {
Repository.saveUser(user)
Log.d("test", "User #${user.id} saved !")
}
}
// Repository.kt
suspend fun saveUser(user: User) {
val documentReference = db
.collection(USERS_COLLECTION).document(user.id)
try {
documentReference.set(user).await()
Log.d("test", "Good")
} catch (e: Exception) {
Log.e("test", "Not good") // catches a JobCancellationException
}
}发布于 2020-09-23 06:46:41
有些事情正在取消这项工作,而你的合作是适当的合作。
可能是您的ViewModel正在被清除,因为您正在使用viewModelScope启动协同线。ViewModel不应该被销毁,除非它的所有者(片段或活动)被销毁。在这种情况发生时,您是在尝试在活动中调用finish(),还是执行片段事务?
或者,可能是协同上下文中的其他内容由于错误而取消了作业。我的猜测是,对documentReference.set(user)的调用导致了一些错误,而await()可能正在取消该作业。
还要确保您对Firestore、Jetpack和KTX扩展的依赖关系是最新的。这可能是一个已经修复的bug。
https://stackoverflow.com/questions/63884115
复制相似问题