android - 协同程序中使用“Dispatchers.Main”的代码块未运行
问题描述
我到处搜索,但没有找到任何似乎可以解决我的问题的方法
我有一个使用协程的函数:
fun onAuthenticated() {
launch (Dispatchers.IO) {
userRepo.retrieveSelf()!!.let { name ->
userRepo.addAuthenticatedAccount(name)
userRepo.setCurrentAccount(name)
}
activity?.setResult(Activity.RESULT_OK, Intent())
// this block doesn't seem to be run
withContext(Dispatchers.Main) {
Log.d(TAG, "ok looks gucci")
activity?.finish()
}
}
}
调用此函数时,withContext(Dispatchers.Main) { ... }
块中的代码不会运行。我正在使用它来访问主线程中的活动。
我有点沮丧,我不确定我是否不明白调度程序/协程应该如何工作,或者我缺少什么。
如果您需要任何其他详细信息或代码,请告诉我!
编辑
所以马尔科是对的。在我移动它activity.?.setResult(Activity.RESULT_OK, Intent())
以便它与主调度程序一起运行之后,我发现代码的另一部分出现userRepo.setCurrentAccount(name)
了问题。如下所示更新代码后,它按预期工作!
override fun onAuthenticated() {
val handler = CoroutineExceptionHandler { _, e ->
Snackbar.make(
web_auth_rootview,
"Authentication unsuccessful",
Snackbar.LENGTH_INDEFINITE
).show()
}
launch(Dispatchers.Main + handler) {
userRepo.retrieveSelf()!!.let { name ->
userRepo.addAuthenticatedAccount(name)
userRepo.setCurrentAccount(name)
}
activity?.apply {
setResult(Activity.RESULT_OK, Intent())
onBackPressed()
}
}
}
非常感谢 Marko 帮助我!
解决方案
activity?.setResult(Activity.RESULT_OK, Intent())
在这里,您尝试从 IO 线程中触摸一个 GUI 组件。这可能会引发异常,但由于它位于 IO 线程上,因此没有任何东西可以捕获它。
您可以将所有内容包装在 try-catch 中,但如果您使用正确的习惯用法,您的程序会自动运行得更好,即launch
在Main
调度程序中,并且只切换到阻塞操作的 IO 上下文:
launch(Dispatchers.Main) {
withContext(Dispatchers.IO) {
userRepo.retrieveSelf()!!.let { name ->
userRepo.addAuthenticatedAccount(name)
userRepo.setCurrentAccount(name)
}
}
activity?.setResult(Activity.RESULT_OK, Intent())
Log.d(TAG, "ok looks gucci")
activity?.finish()
}
现在,如果您在 IO 调度程序中遇到异常,它将传播到顶级协程,这将导致主线程上的异常,并且您的应用程序将随之崩溃。这是在其上添加错误处理逻辑的坚实基础。
当然,这仍然不是您应该使用协程的方式,因为您缺少结构化并发方面。
推荐阅读
- c# - 如何在 C# 中创建 F# 匿名记录?
- amazon-dynamodb - 如何使用 Dynamodb 全局表和 Lambda@edge 选择正确的区域?
- python-3.x - 如何在检测到智能卡后重置此代码而不终止它,从而继续侦听其他智能卡?
- python - 如何将python-ldap模块部署到不上网的Mac电脑(独立包)
- python - 我需要帮助确定如何返回 For 循环的所有内容(而不仅仅是最后一行)
- angular - Angular 中奇怪的 *ngIf 行为
- python - 如何将两个棉花糖计划合二为一
- c# - 从 DTO 使用 C# 中的 OpenXML 写入单元格
- shell - 如何使用 Terraform 将变量更改为值的文件从本地复制到远程?
- 3d - 如何重新排序尺寸?