android - 在协程范围内调用时启动未执行
问题描述
我在协程范围内调用启动,但它不执行。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
函数的范围不同。要解决这个问题,您可以参考 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
协程。
推荐阅读
- nginx - Nginx 重写无法正常工作
- javascript - Vue 从外部链接获取可编辑的内联 SVG
- android - “尝试在空对象引用上调用虚拟方法'void android.graphics.Canvas.drawColor(int)'”我的android应用程序中的错误
- kubernetes - GKE 服务目录 BigQuery ACL/权限问题 - 用户 xx 在项目 yy 中没有 bigquery.jobs.create 权限
- python-3.x - 用于舍入输出中小数位数的单个代码
- c# - 如何使用 asp net 修复刷新(使用数据模型)
- export - 将大量数据导出到制表符分隔文件
- python - 为类拥有的对象组合上下文管理器的 Pythonic 方法
- regex - 如何获得首先获得确切单词的 REGEXP_LIKE,然后附加所有相关的单词?
- java - java导入无法解决