gpt4 book ai didi

kotlin - JobCancellationException StandaloneCoroutine 被取消

转载 作者:行者123 更新时间:2023-12-04 11:16:53 27 4
gpt4 key购买 nike

由于我们使用的是协程(使用了 1.3.5),我们有很多崩溃: JobCancellationException - StandaloneCoroutine 被取消 .

我阅读了很多关于这些问题的线程,我在生产中尝试了很多解决方案,但总是发生崩溃。

在我们所有的 View 模型中,我们都使用了 View 模型范围,所以没关系。

但是在我们的数据层中,我们需要启动一个跟踪事件,即触发即忘任务。在第一步中,我们使用了 GlobalScope.launch .我认为 CancelletationException 是由于这个全局范围造成的,所以我删除了它并使用 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方法?我可以将哪种策略与干净的建筑和这种工作一起使用?

提前致谢

最佳答案

您可以构建一个扩展实用程序来捕获取消异常,并使用它执行您想要的操作:

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
}
或任何 View 模型范围:
myViewModel.viewModelScope.safeLaunch{
// here goes my suspend functions and stuff
}

关于kotlin - JobCancellationException StandaloneCoroutine 被取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60741777/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com