gpt4 book ai didi

android - 我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?

转载 作者:行者123 更新时间:2023-12-03 23:51:25 27 4
gpt4 key购买 nike

viewModelScope用于将协程生命周期绑定(bind)到 ViewModel生命周期。 liveData builder 创建一个 LiveData运行协程,其生命周期绑定(bind)到 LiveData状态,所以,当 LiveData未激活,协程在超时后取消。由于超时,协程不会在配置更改时被取消。

如果我创建一个 LiveData通过 liveData ViewModel 内的生成器,并观察到 ​​LiveDataActivity , LiveData生命周期已经绑定(bind)到 Activity生命周期。我是否应该另外通过 viewModelScope.coroutineContextliveData build 者?我认为我不应该,但在 Android 文档之一 samples它通过了:

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

最佳答案

问: LiveData生命周期已经绑定(bind)到 Activity生命周期。我应该通过 viewModelScopeliveData build 者?

在简单的情况下,当一个 Activity 只有一个 ViewModel , Activity生命周期与 ViewModel 相同生命周期,它不应该改变任何东西,无论你将 'viewModelScope' 传递给 lifeData build 者与否。但在更复杂的情况下,例如,当 ViewModel is shared在 fragment 之间,Fragment生命周期可能与共享的 ViewModel 不匹配生命周期,在这种情况下,在“viewModelScope.coroutineContext”中启动协程是有意义的。

因此,您可以使用 viewModelScope 为您的 提供上下文liveData build 者。

为什么?

According to official doc: A ViewModelScope is defined for each ViewModel in your app. Any coroutine launched in this scope is automatically canceled if the ViewModel is cleared.



所以,它有帮助 取消当前工作 在您的 LiveData因为,它现在绑定(bind)到您的 ViewModelScope .

此外, viewModelScope如果您正在为布局计算一些数据,这很有帮助,您应该将工作范围限定为 ViewModel这样如果 ViewModel被清除,工作将被自动取消以避免消耗资源。

关于android - 我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57150408/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com