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)
您在 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协程。
| 归档时间: |
|
| 查看次数: |
5908 次 |
| 最近记录: |