如何使用 MutableStateFlow 将缓存保存在 android?

How to use MutableStateFlow to save cache in android?

我现在正在实施 MutableStateFlow 以将缓存值存储在 Android MVVM 架构中。目标是,它可以只在第一次获取以避免过多的冗余网络连接,并且它也可以在需要时更新。因此,我有以下问题:

  1. 如何使用以下代码在 MutableStateFlow 中重新设置值并再次请求获取数据?
  2. 我使用惰性保存缓存值是不是走错了路?

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 属性。

获取缓存数据应该发生在上层:

  1. 使用相同的流从本地和网络数据发出
  2. 设置限制何时从网络获取;本地数据缺失、时间限制等

以下函数仅用于说明,如果本地数据不存在或满足约束,则首先从本地存储中获取然后尝试从网络中获取。

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)
    }
}