如何使用 MutableStateFlow 将缓存保存在 android?
How to use MutableStateFlow to save cache in android?
我现在正在实施 MutableStateFlow
以将缓存值存储在 Android MVVM 架构中。目标是,它可以只在第一次获取以避免过多的冗余网络连接,并且它也可以在需要时更新。因此,我有以下问题:
- 如何使用以下代码在 MutableStateFlow 中重新设置值并再次请求获取数据?
- 我使用惰性保存缓存值是不是走错了路?
class WeatherRepository {
private val mDefaultDispatcher: IDefaultDispatcher by inject()
private val scope by lazy { CoroutineScope(mDefaultDispatcher.io() + SupervisorJob()) }
val cacheWeather by lazy {
val flow = MutableStateFlow<List<Weather>?>(null)
scope.launch(mDefaultDispatcher.io()) {
val response = getWeather()
if (response.isValid) {
val data = response.data
flow.value = data
}
}
flow
}
}
class ViewModelA {
private val mRepository: WeatherRepository by inject()
val weather by lazy {
mRepository.cacheWeather.asLiveData()
}
fun requestUpdateOnWeather() {
//TODO (dunno how to make the mutableStateFlow reset and fetch data again)
}
}
class ViewModelB {
private val mRepository: WeatherRepository by inject()
val weather by lazy {
mRepository.cacheWeather.asLiveData()
}
}
感谢任何评论或建议
您的惰性块只会在您使用时初始化 cacheWeather
属性。
获取缓存数据应该发生在上层:
- 使用相同的流从本地和网络数据发出
- 设置限制何时从网络获取;本地数据缺失、时间限制等
以下函数仅用于说明,如果本地数据不存在或满足约束,则首先从本地存储中获取然后尝试从网络中获取。
val flow = MutableFlow<Data>(Data.empty())
fun fetchData() = coroutinesScope.launch {
val localData = getLocalData()
if(localData.isDataPresent()) {
flow.emit(localData)
}
if (willFetchFromNetwork()) {
val networkData = getNetwork()
flow.emit(networkData)
cacheData(networkData)
}
}
我现在正在实施 MutableStateFlow
以将缓存值存储在 Android MVVM 架构中。目标是,它可以只在第一次获取以避免过多的冗余网络连接,并且它也可以在需要时更新。因此,我有以下问题:
- 如何使用以下代码在 MutableStateFlow 中重新设置值并再次请求获取数据?
- 我使用惰性保存缓存值是不是走错了路?
class WeatherRepository {
private val mDefaultDispatcher: IDefaultDispatcher by inject()
private val scope by lazy { CoroutineScope(mDefaultDispatcher.io() + SupervisorJob()) }
val cacheWeather by lazy {
val flow = MutableStateFlow<List<Weather>?>(null)
scope.launch(mDefaultDispatcher.io()) {
val response = getWeather()
if (response.isValid) {
val data = response.data
flow.value = data
}
}
flow
}
}
class ViewModelA {
private val mRepository: WeatherRepository by inject()
val weather by lazy {
mRepository.cacheWeather.asLiveData()
}
fun requestUpdateOnWeather() {
//TODO (dunno how to make the mutableStateFlow reset and fetch data again)
}
}
class ViewModelB {
private val mRepository: WeatherRepository by inject()
val weather by lazy {
mRepository.cacheWeather.asLiveData()
}
}
感谢任何评论或建议
您的惰性块只会在您使用时初始化 cacheWeather
属性。
获取缓存数据应该发生在上层:
- 使用相同的流从本地和网络数据发出
- 设置限制何时从网络获取;本地数据缺失、时间限制等
以下函数仅用于说明,如果本地数据不存在或满足约束,则首先从本地存储中获取然后尝试从网络中获取。
val flow = MutableFlow<Data>(Data.empty())
fun fetchData() = coroutinesScope.launch {
val localData = getLocalData()
if(localData.isDataPresent()) {
flow.emit(localData)
}
if (willFetchFromNetwork()) {
val networkData = getNetwork()
flow.emit(networkData)
cacheData(networkData)
}
}