在协程范围内调用时启动不执行

Pro*_*igy 9 android kotlin android-snackbar kotlin-coroutines coroutinescope

我在协程范围内调用 launch 但它不执行。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()
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*gey 9

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

val scope = CoroutineScope(Dispatchers.Main)
scope.launch {
    // ...
    // in action listener:
    scope.launch { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

更新:

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