在Android上启动协同程序的正确方法是什么?

问题描述 投票:1回答:2

我正在尝试找出如何启动协程。我希望它依次调用两个暂停函数。

我阅读的第一个文档说是这样做的:

class Something {
  fun initialize() {
    launch {
      suspendFun1()
      suspendFun2()
    }
}

但是Android Studio找不到launch方法。然后我了解到official coroutine docs建议使用GlobalScope.launch

class Something {
  fun initialize() {
    GlobalScope.launch {
      suspendFun1()
      suspendFun2()
    }
}

但是我在this post中读到,您不应该使用GlobalScope.launch

所以我找到了另一个blog post,解释说我需要一个CoroutineScope才能调用launch。但这并没有解释如何构建一个。

然后,我发现此blog post解释了如何通过在类上实现CoroutineScope来为Activity和ViewModel建立一个:

class Something : CoroutineScope {
  private lateinit var job: Job
  override val coroutineContext: CoroutineContext
        get() = job + Dispatchers.Main

  fun initialize() {
    job = Job()
    launch {
      suspendFun1()
      suspendFun2()
    }
}

然后我读了此blog post,说我不应该实现CoroutineScope

class Something {
  protected val scope = CoroutineScope(
    Job() + Dispatchers.Main
  )

  fun initialize() {
    scope.launch {
      suspendFun1()
      suspendFun2()
    }
}

但是我不确定我是否理解Job() + Dispatchers.Main的含义,因为这似乎也可行:

class Something {
  protected val scope = CoroutineScope(Dispatchers.Main)

  fun initialize() {
    scope.launch {
      suspendFun1()
      suspendFun2()
    }
}

有人可以简单地向我解释最好的方法吗?如上吗?我确定已经有人问过这个问题,因此对这个重复的问题我深表歉意。但是如您所见,对此尚无明确答案。我想听听您的意见。

android kotlin-coroutines
2个回答
1
投票

最后两个解决方案很好。如果您传递不带上下文的上下文,则CoroutineScope(context: CoroutineContext)将创建一个空的CoroutineScope(context: CoroutineContext)

指定Job是构建它的更明确的方法,因为在某些情况下,您可能想使用job + dispatcher来防止在子作业之一失败时取消整个作用域。

关于在SupervisorJobSupervisorJob中建立作用域,您可以声明KTX片段模块,而不用声明自己的作用域,而可以使用内置在KTX库中的作用域:

Activities

现在在ViewModels// add to your apps dependencies implementation 'androidx.fragment:fragment-ktx:1.2.0-rc02' 内部,您可以使用ActivityFragment内部的lifecycleScope,它们是lifecycleScope支持的范围,并且在销毁它们各自的生命周期时会自动取消。


0
投票

我有Coroutines.kt

ViewModel

并且我通过调用Couroutines.main在我的视图模型中使用它>

© www.soinside.com 2019 - 2024. All rights reserved.