首页 > 解决方案 > 在协程范围内调用时启动未执行

问题描述

我在协程范围内调用启动,但它不执行。Snackbar 操作侦听器正在执行,但启动块由于某种原因未执行。

CoroutineScope(Dispatchers.Main).launch {
                val scope = this
                val mn = snackbarManager(R.id.root);
                Snackbar.make(mn.container, R.string.recpt_deleted, Snackbar.LENGTH_LONG)
                    .setAction(R.string.undo) {
                        scope.launch {**//not executing**
                            Toast.makeText(requireContext(),"Committing",Toast.LENGTH_LONG).show()
                            Log.d("COMMIT", "calling commit")
                           
                        }
                    }
                .show()
            }

标签: androidkotlinkotlin-coroutinesandroid-snackbarcoroutinescope

解决方案


您在 Snackbar 操作侦听器中使用的scope范围与您用于调用第一个launch函数的范围不同。要解决这个问题,您可以参考 main CoroutineScope

val scope = CoroutineScope(Dispatchers.Main)
scope.launch {
    // ...
    // in action listener:
    scope.launch { /*...*/ }
}

或者CoroutineScope在 Snackbar 动作监听器中使用另一个,例如lifecycleScope属性:

lifecycleScope.launch {
    Toast.makeText(requireContext(),"Committing",Toast.LENGTH_LONG).show()
    Log.d("COMMIT", "calling commit")
}

但在我看来,你的代码有点乱。我认为你应该重新考虑你的方法,不要CoroutineScope使用Snackbar.

更新:

当您scope在第一个协程中初始化变量时,当外部协程完成时val scope = this,这scope将变为COMPLETED 。当您在Snackbar动作侦听器中启动内部协程时,scope已经具有COMPLETED状态。我们无法使用 COMPLETED 状态启动CoroutineScope


推荐阅读