kotlin 协程 - 什么是默认范围?

kotlin coroutine - what is default scope?

如果我没有指定任何内容,协程默认范围如何工作。让我们看看这个例子:

class MyAppCompatActivity:AppCompatActivity{
fun getContact() {
        GlobalScope.launch {
            val contact = contacts.getContact() // suspended function
            withContext(Dispatchers.Default) {
               phoneContact.value = contact }
        }
    }
}

检索到联系人时,它只是更新 UI。这被添加到全局范围内,因此协同程序的生命周期可以是整个应用程序的生命周期。

但是让我们在没有 globalScope 的情况下再次做同样的事情:

class MyAppCompatActivity:AppCompatActivity{
fun getContact() {
        launch {
            val contact = contacts.getContact() // suspended function
            withContext(Dispatchers.Default) {
               phoneContact.value = contact }
        }
    }
}

既然我已经删除了 globalScope,getContact 的生命周期是多少?它是否绑定到 MyAppCompatActivity 范围?

您的代码将无法编译,因为必须在 CoroutineScope 对象上调用 launch。该对象指定协程的生命周期。由于您的 activity 没有实现范围,它将无法编译或调用完全不相关的 launch 函数。

我认为这不再是个好主意,因为看起来它们只是用于测试的函数(不会启动协程)。也许这是以前可用的 API,但现在您应该使用 lifecycleScope 将协同程序的范围限定为片段或 activity,并使用 viewModelScope 将它们限定为视图模型的生命周期。这些是 类 中已经可用的属性。

这是我尝试使用 launch 时看到的内容: