android - 错误处理后如何重用 Kotlin 协程?
问题描述
错误处理后如何重用协程?在我的代码中,当协程(使用 CoroutineExceptionHandler)出现任何错误时,我会重新创建一个新的工作和范围实例,它可以工作,购买我认为这不是一个好的选择,也许还有另一种选择
fun getDashBoardData() {
loadingStateLiveData.value = true
scope.launch(scope.coroutineContext + CoroutineExceptionHandler { _, e ->
assetsBalanceLiveData.postValue(Resource.error(app.getString(R.string.no_connection), null))
Log.e(TAG, "CoroutineExceptionHandler - ${e.message}")
job = Job()
scope = CoroutineScope(Dispatchers.Default + job)
loadingStateLiveData.postValue(false)
}) {
// SUSPENDED FUN
assetsBalanceLiveData.postValue(DashboardRepository.getUserAssetsBalance())
// SUSPENDED FUN
incomeGraphDataLiveData.postValue(DashboardRepository.getIncomeGraphData())
loadingStateLiveData.postValue(false)
}
}
解决方案
重新创建工作看起来不是最佳选择。launch{..}
您可以使用or函数启动新的协程,并使用普通块async{..}
处理异常。try/catch
如果这还不够 -supervisorScope{..}
可以帮助确保父作业不会被终止。
您可以查看文档以获取更多详细信息
https://kotlinlang.org/docs/reference/coroutines/exception-handling.html
推荐阅读
- javascript - 如何使用Joi验证其键应与外部对象匹配的另一个键的值是数组的嵌套对象?
- sql-server - 具有参数的视图的内联用户定义函数
- kivy - 当我在 `FileBox` 对象上`click` 时,如何制作具有两个或多个选项的菜单?
- r - 如何根据闪亮的复选框输入将多个 dySeries 发送到辅助轴?
- sql - 从 BigQuery 表中的数组中获取前 N 个元素
- python - 如何将excel文件数据的元素分配给Python中的二维矩阵?
- c - 如何将路径名称存储在 C 中的列表或字符串数组中?
- amazon-web-services - 如何为公共 PUT 请求设置经过身份验证的 S3 REST 端点
- vb.net - 如何使用在 VB.NET 应用程序的 WHERE 子句中调用的函数执行 SELECT 语句?
- reactjs - 在轴谷歌图表的两端添加标签