SoundViewModel
是ViewModel
类,val listSoundRecordState
可能会被App中的一些模块使用。
在代码A中,我在需要使用数据listSoundRecordState
时调用了fun collectListSoundRecord()
,但是fun collectListSoundRecord()
可能会因为Jetpack Compose重组而反复启动,不知道会不会耗费很多系统资源?
在代码B中,我在init { }
中启动private fun collectListSoundRecord()
,collectListSoundRecord()
只会启动一次,但即使我不需要使用数据listSoundRecordState
,它也会一直保存在内存中,直到App代码关闭,这种方式会消耗很多系统资源吗?
- 代码A**
@HiltViewModel
class SoundViewModel @Inject constructor(
...
): ViewModel() {
private val _listSoundRecordState = MutableStateFlow<Result<List<MRecord>>>(Result.Loading)
val listSoundRecordState = _listSoundRecordState.asStateFlow()
init { }
//It may be launched again and again
fun collectListSoundRecord(){
viewModelScope.launch {
listRecord().collect {
result -> _listSoundRecordState.value =result
}
}
}
private fun listRecord(): Flow<Result<List<MRecord>>> {
return aSoundMeter.listRecord()
}
}
- 代码B**
@HiltViewModel
class SoundViewModel @Inject constructor(
...
): ViewModel() {
private val _listSoundRecordState = MutableStateFlow<Result<List<MRecord>>>(Result.Loading)
val listSoundRecordState = _listSoundRecordState.asStateFlow()
init { collectListSoundRecord() }
private fun collectListSoundRecord(){
viewModelScope.launch {
listRecord().collect {
result -> _listSoundRecordState.value =result
}
}
}
private fun listRecord(): Flow<Result<List<MRecord>>> {
return aSoundMeter.listRecord()
}
}
2条答案
按热度按时间llycmphe1#
只有当中间流(保存在
SoundViewModel
中的流)有订阅者时,才收集原始流(来自listRecord()
)并缓存结果,这可能会使您受益。在您的例子中,订阅者是一个
Composable
函数,它收集值(并且可能经常重新组合)。可以使用
stateIn()
的非挂起变体来实现这一点,因为您有一个默认值。为了从UI层使用
StateFlow
(@Composable
函数),您必须将其转换为State
,如下所示:qv7cva1a2#
我使用下面的
composable
实现,其中view-model
使用LaunchedEffect
宠物小精灵详细屏幕.kt
宠物小精灵详细信息虚拟机kt