【问题标题】:Get reference to a coroutine job in coroutine scope在协程范围内获取对协程作业的引用
【发布时间】:2021-04-22 00:54:07
【问题描述】:

在 kotlin 协程中,大多数标准构建器方法(例如启动)返回对作业的引用,

这样做的设计是将这些参考保存在诸如地图/列表(“手动”管理已启动的作业)之类的东西中,还是有办法在给定范围内找到已启动的作业?

 scope.launch { /* starting a coroutine in scope */ }

以后有没有办法在不保留 scope.launch 返回的已启动作业的引用的情况下获取启动的协程引用,或者我们应该自己管理这个(例如,保留启动返回的引用)?

【问题讨论】:

  • 为了简化问题,有没有办法检索在协程范围内启动的所有作业?有没有办法将标签分配给协程,然后再检索它,或者没有这个功能?万一不想在整个范围上调用取消,而是在少数协程上调用

标签: kotlin coroutine


【解决方案1】:

您需要保存对父作业的引用

val job = Job()
val scope = CoroutineScope(Dispatchers.IO + job)
scope.launch {
    ...
    job.children // this return all jobs started in this scope
}

【讨论】:

  • 好的,谢谢您的回答,但是您可以例如为工作分配标签,然后在子序列中查找吗?我的意思是你知道你已经在这个范围内开始了一项特定的工作,你将如何找到它?一种方法可能是在启动的作业上使用哈希码并保留它以供以后使用
  • 实际上我会在启动后保留对特定作业的全局引用,因此我可以单独管理它,但也许还有另一种方法,也许我可以使用 CoroutineContext.Key
  • 这是最好的方法。另一种方法是通过索引。例如job.children.elementAt(0) 是第一个推出的孩子
  • 是的,我知道没有直接/简单的方法可以做到这一点,而且通过索引还不清楚找到具体的工作,谢谢
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2019-05-02
  • 2019-06-22
  • 2020-10-22
  • 2019-05-28
  • 2022-07-05
  • 2019-04-27
相关资源
最近更新 更多