- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在试验 在 Android 上处理 Kotlin 协程中的异常 .
我的用例是我想在后台(以异步方式)执行一堆任务并在单个事件上更新多个 UI 组件。
我设计了一个 BaseActivity
实现结构 CoroutineScope
所以我可以结合使用事件生命周期调用的协程。
另外,我有一个 Repository
处理网络调用的类。
我已经实现了同时运行多个任务。我知道我是否使用单个 Job
反对取消 onDestroy()
上的所有协程事件和在事件中执行( launch
)多个协程,任何单个协程中的异常将取消 Job
来自其 CoroutineContext
.从 Job
附加到事件的生命周期,它也会取消所有其他协程。
我试过使用 CoroutineExceptionHandler
.它捕获异常但取消了 Job
也。结果取消了所有其他协程。
我想要的是?
Job
要附加事件生命周期的对象 class BaseActivity : AppCompatActivity(), CoroutineScope {
val job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
launch(coroutineContext) {
Log.i("GURU", "launch1 -> start")
val result1Deferred = async { Repository().getData(1) }
val result2Deferred = async { Repository().getData(2) }
Log.i("GURU", "awaited result1 = " + result1Deferred.await() + result2Deferred.await())
}
//If Exception is Thrown, Launch1 should still continue to complete
advancedLaunch(coroutineContext) {
Log.i("GURU", "launch2 -> start")
val result1Deferred = async { Repository().getData(3) }
val result2Deferred = async { Repository().getData(4) }
delay(200)
throw Exception("Exception from launch 2")
Log.i("GURU", "awaited result2 = " + result1Deferred.await() + result2Deferred.await())
}
}
fun CoroutineScope.advancedLaunch(context: CoroutineContext = EmptyCoroutineContext,
exceptionBlock: (Throwable) -> Unit = {Log.i("GURU", it.message)},
launchBlock: suspend CoroutineScope.() -> Unit) {
val exceptionHandler = CoroutineExceptionHandler { _, throwable -> exceptionBlock(throwable)}
launch(context + exceptionHandler) { launchBlock() }
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
Log.i("GURU", "job -> cancelled")
}
}
I/GURU: launch1 -> start
I/GURU: launch2 -> start
I/GURU: getData -> start 1
I/GURU: getData -> start 2
I/GURU: getData -> start 4
I/GURU: getData -> start 3
I/GURU: Exception from launch 2
--------- beginning of crash
最佳答案
您可能想更换您的 Job
与 SupervisorJob
.
它可以防止异常“向上”传播(一个失败的子项不会导致整个作业失败),但仍然允许您“向下”(向正在运行的子项)推送取消。
关于kotlin - 避免在子协程异常时取消父作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53132989/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!