Android 是否应将viewModelScope.coroutineContext传递给liveData builder函数?

Android 是否应将viewModelScope.coroutineContext传递给liveData builder函数?,android,android-architecture-components,android-livedata,android-viewmodel,kotlin-coroutines,Android,Android Architecture Components,Android Livedata,Android Viewmodel,Kotlin Coroutines,用于将协程生存期绑定到ViewModel生命周期。生成器创建一个运行协同程序的LiveData,该协同程序的生存期绑定到LiveData状态,因此,当LiveData未处于活动状态时,协同程序会在超时后取消。由于超时,配置更改时不会取消协同路由 如果我在ViewModel中通过LiveData生成器创建LiveData,并观察到Activity中的LiveData生命周期已绑定到Activity生命周期。我是否应该另外将viewModelScope.coroutineContext传递给live

用于将协程生存期绑定到
ViewModel
生命周期。生成器创建一个运行协同程序的
LiveData
,该协同程序的生存期绑定到
LiveData
状态,因此,当
LiveData
未处于活动状态时,协同程序会在超时后取消。由于超时,配置更改时不会取消协同路由

如果我在
ViewModel
中通过
LiveData
生成器创建
LiveData
,并观察到
Activity
中的
LiveData
生命周期已绑定到
Activity
生命周期。我是否应该另外将
viewModelScope.coroutineContext
传递给
liveData
builder?我认为我不应该这样做,但在一份Android文档中,它传递了:

class MyViewModel: ViewModel() {
    private val userId: LiveData<String> = MutableLiveData()
    val user = userId.switchMap { id ->
        liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
            emit(database.loadUserById(id))
        }
    }
}
类MyViewModel:ViewModel(){
private val userId:LiveData=MutableLiveData()
val user=userId.switchMap{id->
liveData(context=viewModelScope.coroutineContext+Dispatchers.IO){
emit(database.loadUserById(id))
}
}
}

Q:
LiveData
生命周期已绑定到
活动
生命周期。我是否应该将
viewModelScope
传递给
liveData
builder

在简单的情况下,当一个活动只有一个
ViewModel
时,
Activity
生命周期与
ViewModel
生命周期相同,无论是否将“viewModelScope”传递给
lifeData
构建器,它都不应改变任何内容。但在更复杂的情况下,例如,当片段之间的
ViewModel
时,
Fragment
生命周期可能与共享的
ViewModel
生命周期不匹配,在这种情况下,在“viewModelScope.coroutineContext”中启动协同程序是有意义的


因此,您可以使用
viewModelScope
为您的
liveData
构建器提供上下文

为什么?

根据:为每个视图定义了一个
ViewModelScope
ViewModel
在应用程序中。在此范围内启动的任何协同程序都是 如果清除了视图模型,则自动取消

因此,它有助于取消
LiveData
中的当前作业,因为它现在已绑定到
ViewModelScope


此外,
viewModelScope
对于为布局计算某些数据很有帮助,您应该将工作范围限定到
ViewModel
,以便在清除
ViewModel
时,自动取消工作以避免消耗资源。

似乎只能将实时数据传递给处于“已启动”或“已恢复”状态的LifecycleOwner。因此,在
viewModelScope
中运行例程时,如果观察者处于这些状态之外,他们可能不会接收发出的数据。您是否打算使用
viewModelScope
?你的问题有点复杂。为什么不使用LiveData scope(
lifecycle LiveData ktx
)如何触发用户
LiveData
?请您稍微解释一下您的答案:“虽然您将LiveData绑定到活动生命周期,但您观察的LiveData的ViewModel也绑定到相同的活动生命周期。”。如果协同路由生存期已绑定到该活动,则当该活动被销毁时,该协同路由将被取消。如果我另外将viewModelScope上下文传递给协同程序,它会改变什么?因此,如果我这样做,协同程序生命周期应该绑定到该ViewModel,是的,这是有意义的。当ViewModel生命周期与LifecycleOwner生命周期不同时,我没有考虑这种情况。这是我要求的,你能更新你的答案吗?然后我就可以接受了。~“取消当前工作”。谁应该这样做?如果您将视图模型范围传递给live data builder,那么一旦视图模型范围被取消,它就会被取消。在我们的例子中,一旦视图模型达到清除状态。