首页 > 解决方案 > 在 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)

但是通过这种方式,我必须使用延迟来使流程正常工作(发出列表后抛出错误),否则,它不起作用,只会抛出异常。 而且我真的不想让我的代码依赖于延迟才能正常工作! 所以我想知道如果您有更好的解决方案,您是否可以分享您的想法。

标签: androidkotlintry-catchflow

解决方案


推荐阅读