android - 我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?
问题描述
viewModelScope用于将协程生命周期绑定到ViewModel
生命周期。liveData构建器创建一个LiveData
运行协程,其生命周期绑定到LiveData
状态,因此,当LiveData
它不活动时,协程在超时后取消。由于超时,协程不会在配置更改时被取消。
如果我在 a 中创建一个LiveData
vialiveData
构建器,并在 中ViewModel
观察到,生命周期已经绑定到生命周期。我是否应该另外将其传递给构建器?我认为我不应该这样做,但在其中一个 Android 文档示例中它通过了:LiveData
Activity
LiveData
Activity
viewModelScope.coroutineContext
liveData
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
生命周期已经绑定到Activity
生命周期。我应该把它传递viewModelScope
给liveData
建造者吗?
在简单的情况下,当一个 Activity 只有一个ViewModel
时,Activity
生命周期与生命周期相同ViewModel
,并且它不应该改变任何东西,无论你是否将 'viewModelScope' 传递给lifeData
构建器。但在更复杂的情况下,例如,当片段之间ViewModel
共享Fragment
时,生命周期可能与共享的生命周期不匹配ViewModel
,在这种情况下,在“viewModelScope.coroutineContext”中启动协程是有意义的。
因此,您可以使用viewModelScope
为您的liveData
构建器提供上下文。
为什么?
根据官方文档:在您的应用程序中
ViewModelScope
为每个定义了 A。如果清除,则在此范围内启动的ViewModel
任何协程都会自动取消。ViewModel
因此,它有助于取消您当前的工作,LiveData
因为它现在已绑定到您的ViewModelScope
.
此外,viewModelScope
如果您正在为布局计算一些数据ViewModel
,这很有帮助,您应该将工作范围限定为这样,如果ViewModel
清除了,工作会自动取消以避免消耗资源。
推荐阅读
- mule - 骡流没有触发
- gradle - com.jfrog.artifactory gradle 插件 401 未经授权
- python - 求和的指数
- php - 使用 file_get_contents() 获取特定数据
- c++ - 如何在 Visual Studio 中查看 static_assert 的“故障源”?
- php - 如何使用php laravel将二进制图像上传到sql server
- node.js - npm i 期间出错:node-pre-gyp install --fallback-to-build --library=static_library
- amazon-web-services - AWS Glue Crawler 创建分区和文件表
- node.js - 是否可以使用 localStorage 之类的私有环境变量?
- .net - 根据 DataTable 更改 DGV 复选框状态