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
时看到的内容:
如果我没有指定任何内容,协程默认范围如何工作。让我们看看这个例子:
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
时看到的内容: