使用未运行的"Dispatchers.Main"协同程序中的代码块



我到处搜索,我还没有找到任何解决我问题的方法

我有一个使用Coroutines的功能:

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) { ... }块中的代码未运行。我正在使用它来访问主线程中的活动。

我一直感到沮丧,我不确定我是否不明白调度员/Coroutine应该如何工作或缺少一些东西。

让我知道您是否需要任何其他详细信息或代码!

编辑马克是对的。在移动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线程上,因此没有任何捕获。

您可以将所有内容包装在尝试捕捉中,但是如果您使用了适当的成语,则您的程序会自动工作得更好,即Main调度程序中的launch,仅切换到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调度程序中获得异常,它将传播到顶级Coroutine,这将在主线程上引起例外,并且您的应用程序将随之崩溃。这是一个坚实的基础,可以在。

之上添加错误处理逻辑

当然,这仍然不是您应该与Coroutines一起工作的方式,因为您缺少结构化并发方面。

相关内容

  • 没有找到相关文章

最新更新