【问题标题】:Cancel all pending Kotlin jobs from ViewModel's onCleared从 ViewModel 的 onCleared 中取消所有待处理的 Kotlin 作业
【发布时间】:2019-04-12 09:31:24
【问题描述】:

使用 Kotlin 1.3,可以使用 GlobalScope.launch 启动作业,但我似乎无法弄清楚的一件事是如何跟踪由 ``GlobalScope.launch` 返回的 Job 并取消所有挂起的作业,如果它们是活跃的。

在旧版本的launch 中,可以指定parent = parentJob,并且可以简单地取消parentJob。但是当使用GlobalScope.launch 时,如何(轻松)取消所有待处理的作业,所以从 ViewModel 的 onCleared 中可以取消所有待处理的东西。

【问题讨论】:

  • 答案是你不应该使用GlobalScope.launch。您必须定义自己的范围。

标签: kotlin-android-extensions kotlinx.coroutines


【解决方案1】:

所以基本上你可以让你的 ViewModel/AppComptActivity 等继承自 CoroutineScope。或者你可以像这样使用组合:

```

private val pendingJobs = Job()
private val coroutineScope = CoroutineScope(contextProvider.io + pendingJobs)

...
...

    coroutineScope.launch  {

    withContext(contextProvider.UI) {

    }
    }

```

然后在适当的销毁方法中调用pendingJobs.cancel() 来终止挂起的作业。

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 2018-07-12
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多