如何解决在协程镜中调用时启动未执行
我正在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()
}
解决方法
您在Snackbar操作侦听器中使用的scope
与调用第一个launch
函数所使用的作用域不同。要解决该问题,您可以参考主要的CoroutineScope
:
val scope = CoroutineScope(Dispatchers.Main)
scope.launch {
// ...
// in action listener:
scope.launch { /*...*/ }
}
或在Snackbar操作侦听器中使用另一个CoroutineScope
,例如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 状态。我们不能使用CoroutineScope
处于 COMPLETED 状态的协程。
对于第二个scope
launch
,您应使用Dispatchers.Main
,因为:
Main
coroutine
dispatcher
仅限于使用UI对象进行操作的Main线程。通常,此类dispatchers
是单线程的。
第一方法:
然后,您应该将代码更改为此:
CoroutineScope(Dispatchers.Main).launch {
Snackbar.make(requireView(),"milad",Snackbar.LENGTH_LONG)
.setAction("clickMe"){
CoroutineScope(Dispatchers.Main).launch {
Toast.makeText(requireContext(),Toast.LENGTH_LONG).show()
Log.d("COMMIT","calling commit")
}
}.show()
}
更新:
第二种方式:
val coro= CoroutineScope(Dispatchers.Main)
coro.launch {
Snackbar.make(requireView(),Snackbar.LENGTH_LONG)
.setAction("clickMe"){
coro.launch {
Toast.makeText(requireContext(),Toast.LENGTH_LONG).show()
Log.d("COMMIT","calling commit")
}
}.show()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。