我正在尝试找出如何启动协程。我希望它依次调用两个暂停函数。
我阅读的第一个文档说是这样做的:
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()
}
}
有人可以简单地向我解释最好的方法吗?如上吗?我确定已经有人问过这个问题,因此对这个重复的问题我深表歉意。但是如您所见,对此尚无明确答案。我想听听您的意见。
最后两个解决方案很好。如果您传递不带上下文的上下文,则CoroutineScope(context: CoroutineContext)
将创建一个空的CoroutineScope(context: CoroutineContext)
。
指定Job
是构建它的更明确的方法,因为在某些情况下,您可能想使用job + dispatcher
来防止在子作业之一失败时取消整个作用域。
关于在SupervisorJob
和SupervisorJob
中建立作用域,您可以声明KTX片段模块,而不用声明自己的作用域,而可以使用内置在KTX库中的作用域:
Activities
现在在ViewModels
和// add to your apps dependencies
implementation 'androidx.fragment:fragment-ktx:1.2.0-rc02'
内部,您可以使用Activity
和Fragment
内部的lifecycleScope
,它们是lifecycleScope
支持的范围,并且在销毁它们各自的生命周期时会自动取消。
我有Coroutines.kt
ViewModel
并且我通过调用Couroutines.main在我的视图模型中使用它>