1

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

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

4

2 回答 2

3

所以基本上事实证明你可以让你的 ViewModel/AppComptActivity 等从 CoroutineScope 继承。或者你可以使用这样的组合:

```

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

...
...

    coroutineScope.launch  {

    withContext(contextProvider.UI) {

    }
    }

```

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

于 2018-11-10T20:36:58.297 回答
1

GlobalScope强烈建议不要使用。在Android KTX库中,有一些方便的范围可用于启动协程。使用它们,您无需考虑取消工作,它们旨在自行完成。CoroutineScope年代:

  • ViewModel课堂上是viewModelScopeCoroutineScope绑定到并在清除Dispatchers.Main时自动取消ViewModel。您可以使用viewModelScope而不是为每个ViewModel. 依赖:

    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0"
    
  • Activity/FragmentlifecycleScopeLifecycle当被销毁时,在此范围内启动的任何协程都会被取消。您可以使用或属性访问CoroutineScope的。依赖:Lifecyclelifecycle.coroutineScopelifecycleOwner.lifecycleScope

    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"
    

启动协程的示例ViewModel

viewModelScope.launch {...}
于 2022-01-15T13:37:16.643 回答