Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin JobCancellationException标准操作例程已取消_Kotlin_Exception_Coroutine_Kotlin Coroutines - Fatal编程技术网

Kotlin JobCancellationException标准操作例程已取消

Kotlin JobCancellationException标准操作例程已取消,kotlin,exception,coroutine,kotlin-coroutines,Kotlin,Exception,Coroutine,Kotlin Coroutines,由于我们使用的是协同程序(使用了1.3.5),所以出现了很多崩溃:作业取消异常-标准操作程序被取消 我读了很多关于这些问题的文章,并在生产中尝试了很多解决方案,但崩溃总是发生 在我们所有的viewmodels中,我们都使用viewmodelscope,所以这是正常的 但在我们的数据层中,我们需要启动一个跟踪事件的任务,这是一项“发射并忘记”任务。在第一步中,我们使用了GlobalScope.launch。我认为CanceleTationException是由于这个全局作用域引起的,所以我删除了它

由于我们使用的是协同程序(使用了1.3.5),所以出现了很多崩溃:作业取消异常-标准操作程序被取消

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

在我们所有的viewmodels中,我们都使用viewmodelscope,所以这是正常的

但在我们的数据层中,我们需要启动一个跟踪事件的任务,这是一项“发射并忘记”任务。在第一步中,我们使用了
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编译器可能会修复它。