Kotlin JobCancellationException标准操作例程已取消
由于我们使用的是协同程序(使用了1.3.5),所以出现了很多崩溃:作业取消异常-标准操作程序被取消 我读了很多关于这些问题的文章,并在生产中尝试了很多解决方案,但崩溃总是发生 在我们所有的viewmodels中,我们都使用viewmodelscope,所以这是正常的 但在我们的数据层中,我们需要启动一个跟踪事件的任务,这是一项“发射并忘记”任务。在第一步中,我们使用了Kotlin JobCancellationException标准操作例程已取消,kotlin,exception,coroutine,kotlin-coroutines,Kotlin,Exception,Coroutine,Kotlin Coroutines,由于我们使用的是协同程序(使用了1.3.5),所以出现了很多崩溃:作业取消异常-标准操作程序被取消 我读了很多关于这些问题的文章,并在生产中尝试了很多解决方案,但崩溃总是发生 在我们所有的viewmodels中,我们都使用viewmodelscope,所以这是正常的 但在我们的数据层中,我们需要启动一个跟踪事件的任务,这是一项“发射并忘记”任务。在第一步中,我们使用了GlobalScope.launch。我认为CanceleTationException是由于这个全局作用域引起的,所以我删除了它
GlobalScope.launch
。我认为CanceleTationException是由于这个全局作用域引起的,所以我删除了它,并使用SupervisorJob
和CoroutineExceptionHandler
在数据层中创建了一个扩展:
private val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
private val coroutineExceptionHandler by lazy { CoroutineExceptionHandler { _, throwable -> logw("Error occurred inside Coroutine.", throwable) } }
fun launchOnApp(block: suspend CoroutineScope.() -> Unit) {
appScope.launch(coroutineExceptionHandler) { block() }
}
但我总是看到这个代码崩溃。我是否需要使用cancelAndJoin
方法?请告诉我,我可以用什么策略来处理一个干净的archi和这种工作
提前感谢您可以构建一个捕获取消异常的扩展实用程序,并对其执行所需操作:
fun CoroutineScope.safeLaunch(block: suspend CoroutineScope.() -> Unit): Job {
return this.launch {
try {
block()
} catch (ce: CancellationException) {
// You can ignore or log this exception
} catch (e: Exception) {
// Here it's better to at least log the exception
Log.e("TAG","Coroutine error", e)
}
}
}
您可以将扩展与您选择的协同程序范围一起使用,例如全局范围:
GlobalScope.safeLaunch{
// here goes my suspend functions and stuff
}
或任何viewmodel范围:
myViewModel.viewModelScope.safeLaunch{
// here goes my suspend functions and stuff
}
你找到解决方案了吗?我面临着同样的问题,你找到了根本原因或解决方案了吗?任何消息或解决方案,我都有相同的错误?解决方案围绕着GlobalScope.launch{}。这可能是遗留kotlin js编译器的问题。新的IR编译器可能会修复它。