Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – Kotlin协程取消后无法捕获异常抛出大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
使用 kotlinx.coroutines lib如果在取消协程后抛出异常,我就无法捕获异常.这会导致应用崩溃.

fun foo() {
  val job = launch(UI) {
     try {
        Log.d("TAG","Start coroutIne")
        run(CommonPool) {
           Log.d("TAG","Start bg task")
           // Intentionally make bg task running for a long time
           SystemClock.sleep(2000)
           Log.d("TAG","Throw bg task exception")
           throw RuntimeException("Bg task exception")
        }
     } catch (e: Exception) {
        Log.e("TAG","Handle coroutIne exception",E)
     }
  }

  launch(UI) {
     delay(1000)
     Log.d("TAG","Cancel job = ${job.cancel()}")
  }

}

在Android上运行此功能生成以下日志输出

07-26 15:09:10.038 31518-31518/co.foo.bar D/MainActivity: Start coroutIne
07-26 15:09:10.044 31518-31547/co.foo.bar D/MainActivity: Start bg task
07-26 15:09:11.046 31518-31518/co.foo.bar D/MainActivity: Cancel job = true
07-26 15:09:11.047 31518-31518/co.foo.bar E/MainActivity: Handled coroutIne exception
                           java.util.concurrent.CancellationException: Job was cancelled
                           at kotlinx.coroutines.experimental.JobSupport$CompletedExceptionally.getException(Job.kt:921)
                           at kotlinx.coroutines.experimental.RunCompletion.afterCompletion(Builders.kt:198)
                           ...
                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
07-26 15:09:12.046 31518-31547/co.foo.bar D/MainActivity: Throwing bg task exception

--------- beginning of crash
07-26 15:09:12.046 31518-31547/co.foo.bar E/AndroidRuntime: FATAL EXCEPTION: ForkJoinPool.commonPool-worker-1
Process: co.foo.bar,PID: 31518
                           java.lang.RuntimeException: Bg task exception
                           at co.foo.barsample.MainActivity$onCreate$1$job$1$1.doResume(MainActivity.kt:36)
                           at kotlin.coroutInes.experimental.jvm.internal.CoroutIneImpl.resume(CoroutIneImpl.kt:54)
                           at kotlinx.coroutines.experimental.DispatchTask.run(CoroutIneDispatcher.kt:120)
                           at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1383)
                           at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:256)
                           at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1123)
                           at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1961)
                           at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1909)
                           at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:128)
07-26 15:09:12.050 1705-2190/system_process W/Activitymanager:   Force finishing activity co.foo.bar/co.foo.barsample.MainActivity

似乎是调用cancel()抛出了成功捕获的CancellationException.但是没有捕获后续的RuntimeException.我认为在取消作业后,以下异常应该被lib忽略?或者如何在不抛出CancellationException异常的情况下静取消作业?

解决方法

使用 CoroutineExceptionHandler作为addiTinoal coroutIne上下文来处理异常,用于启动或运行

run(CommonPool + CoroutIneExceptionHandler({ _,e ->
   Log.e("TAG","CoroutIneExceptionHandler",E)
})) {
    ...
}

要么

launch(UI + CoroutIneExceptionHandler({ _,E)
})) {
   ...
}

大佬总结

以上是大佬教程为你收集整理的android – Kotlin协程取消后无法捕获异常抛出全部内容,希望文章能够帮你解决android – Kotlin协程取消后无法捕获异常抛出所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。