关于协程异常处理与调度器结合异常问题


#1

协程用CoroutineExceptionHandler处理异常的时候,这个调度是在Default线程的,将它直接做上下文,这个协程相当于在子线程的,如何调度到主线程,有人知道么?
也就是说:CoroutineExceptionHandler是一个上下文,调度器其实也是一个上下文,如何将CoroutineExceptionHandler和Dispatchers.Main结合?

按照常规操作:

class MyCoroutineExceptionHandler : CoroutineExceptionHandler {
    override val key = CoroutineExceptionHandler

    override fun handleException(context: CoroutineContext, exception: Throwable) {
        println("exception = $exception")
    }
}

fun test02() {
    GlobalScope.launch(MyCoroutineExceptionHandler() + Dispatchers.Main) {
        println(Thread.currentThread().name)
        throw IllegalStateException("-----")
    }
}

这样操作,会出现以下异常:

java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize. For tests Dispatchers.setMain from kotlinx-coroutines-test module can be used

如何解决?


#2

自己找到原因了,之所以出现这异常,是因为我直接以纯Java形式在mian()方法中执行的,这样导致无法切到Main中,如果是在Android中运行,这样是正常的,最后补充下:

https://juejin.im/post/5ceb4749518825141c356cbe

这里写的:
image

可能一不下心就进坑了。


京ICP备16022265号-2 Kotlin China 2017 - 2018