Kotlin协程父子关系

wbgh16ku  于 2023-03-24  发布在  Kotlin
关注(0)|答案(1)|浏览(193)

有谁能解释一下viewModelScope中这3个协程之间的区别吗?

viewModelScope.launch {
            launch {}
            launch {}
        }

        viewModelScope.launch {
            viewModelScope.launch {}
            viewModelScope.launch {}
        }

        viewModelScope.launch {
            coroutineScope {
                launch {}
            }
            coroutineScope {
                launch {}
            }
        }

我很确定第一个,2个子协程被启动,如果一个产生了一个异常而没有处理,它将传播到父协程,另一个将被取消,父协程将在最后被取消。

uidvcgyl

uidvcgyl1#

大多数协程构建器函数,如coroutineScope()withContext()launch()等,提供了一个CorouineScope作为this,这个作用域可以被认为是“当前”协程。如果我们使用这个对象来启动新的协程,这意味着它们成为当前协程的子对象。如果我们使用另一个协程作用域,则新的协同程序是该协同程序范围的子程序,并且通常与当前协同程序无关。
这意味着:

  1. launch {}-它启动一个新的协程作为当前协程的子进程。
  2. viewModelScope.launch {}-新协程是viewModelScope的子协程,它与当前协程无关。在您的特定情况下,新协程是调用协程的兄弟。
  3. coroutineScope { launch {} }-这和1差不多。

相关问题