【问题标题】:Knowing all status of a Job with Kotlin coroutines使用 Kotlin 协程了解 Job 的所有状态
【发布时间】:2020-05-26 23:35:00
【问题描述】:

可以知道协程Job的所有状态吗?

我找到了这个功能扩展,但我无法访问 Job 的所有状态:

fun Job.status(): String = when {
    isCancelled -> "cancelled"
    isActive -> "Active"
    isCompleted -> "Complete"
    else -> "Nothing"
}

Job 类没有 isNewisCancellingisWaitingForChildren 函数。为什么?

【问题讨论】:

标签: kotlin coroutine kotlin-coroutines kotlin-android-extensions


【解决方案1】:

感谢 Drawn Roccoon 我找到了解决方案:

fun Job.status(): String = when {
    isActive -> "Active/Completing"
    isCompleted && isCancelled -> "Cancelled"
    isCancelled -> "Cancelling"
    isCompleted -> "Completed"
    else -> "New"
}

此链接中的更多信息:https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/

【讨论】:

  • 你可以最小化这个,第一行只是isActive,然后其余的子句根本不需要检查isActive。另一方面,代码对比赛是开放的,因为您不能原子地读取标志。例如,您可能会自相矛盾地获得已完成作业的“新”状态。
  • isCancelled -> "Cancelling" --- 我认为这是错误的,因为您假设 !isCompleted 没有检查它。此外,您至少可以通过在when 之前读取标志一次来降低竞争条件的几率。它仍然无法解决问题。
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 2019-12-06
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多