android - 在 Kotlin 中分别组合两个列表流和处理捕获
问题描述
我想从服务器获取列表流和从数据库中获取相同类型的列表流,并在将它们比较后发出一个新列表。假设我们在存储库中有一个这样的函数:
fun getAllItems():Flow<List<Item>>{
return flow<List<Item>> {
val onlineItems = api.getAll()
val offlineItems = db.getAll()
val resultList= compareItems(onlineItems , offlineItems )
emit(resultList)
}.flowOn(Dispatchers.IO)
}
在 viewModel 我们有这样的东西:
repo.getAllItems().onEach{
_liveData.postValue(it)
}.catch{
handleError(it)
}.launchOn(viewModelScope)
但有时 API 请求可能会遇到异常,因此我们将在流的 catch 范围内获得一个可抛出的对象,这对于处理 ViewModel 中的错误也很重要
如果在线列表面临异常并且同时在 ViewModel 中处理 API 请求的流异常,那么仅获取离线列表的最佳方法是什么?
请注_ _ _ _ _ _也在 viewModel 中流动。
即使我找到了解决方法:
return flow<List<Item>> {
val resultList= mutableListOf<Item>()
var error:Exception?=null
try {
val onlineItems = api.getAll()
resultList.addAll(onlineItems )
}catch (e:java.lang.Exception){
error = e
}finally {
val offlineItems = db.getAll()
resultList.addAll(compareItems(onlineItems , offlineItems ))
emit(resultList)
delay(100)
error?.let {
throw it
}
}
}.flowOn(Dispatchers.IO)
但是通过这种方式,我必须使用延迟来使流程正常工作(发出列表后抛出错误),否则,它不起作用,只会抛出异常。 而且我真的不想让我的代码依赖于延迟才能正常工作! 所以我想知道如果您有更好的解决方案,您是否可以分享您的想法。
解决方案
推荐阅读
- vue.js - 从插槽模板中访问当前组件数据
- openid-connect - 如何在不同的后端服务(如salesforce、Heroku、Nodejs)中使用相同的开放ID 连接开放ID 是否可能?
- mule - Mulesoft Netsuite - 列出/搜索 Netsuite 中可用的所有自定义字段值
- python-3.x - 如何让 colab 访问 github 存储库中的文件夹以处理其中的文件?
- javascript - onclick 函数使用 classList 添加和删除 CSS 类
- deck.gl - deck.gl - 是否可以增加点击半径?
- python - 从德语语料库中提取英语单词用于未来的情感分析
- bootstrap-modal - bootstrap 5 modal 根本不显示
- c# - 如何在工作时暂停多文件复制?
- javascript - 可拖动对象与平面的交点