当前位置: 首页 > 知识库问答 >
问题:

如何发出错误,然后使用RxJava发出缓存数据?

明正德
2023-03-14

我正在MVP解决方案中使用RxJava,我希望实现以下场景:

>

如果由于任何原因不成功(没有互联网-服务器无法访问-服务器内部错误)显示适当的消息,但也使用缓存的数据填充视图。

制约因素:

>

  • 我不想使用任何额外的回调(RX可以做到这一切)

    我不想直接从演示者访问本地回购

    我尝试的内容:

    在我的回购中:

        override fun getRepos(userName: String, page: Int, pageSize: Int):Observable<List<Repo>> {
    
     return githubRemoteService.getReposList(userName, page, pageSize)
                    .subscribeOn(schedulersProvider.ioThread())
                    .flatMap { repos ->
                        val mappedRepos = remoteResponseMapper.mapRepoResponse(repos)
                        githubLocalService.saveRepos(mappedRepos)
                        Observable.just(mappedRepos)
                    }
     .onErrorResumeNext(Observable.just(githubLocalService.getReposList(userName, page, pageSize)))
                   .observeOn(schedulersProvider.mainThread())
    
        }
    

    在我的演讲者:

    githubInteractor.getRepos(userName, page, pageSize).subscribe(
                { repos ->
                     showReposInView(repos)
                },
                { error ->
                    digestAndShowErrorInView(error)  //the problem is here - no error will be present here
                })
    

    正如我们所知,当我使用onErrorResumeNext时,可观察的源会发生变化,但永远不会发出错误。

    如何先发出错误,然后再发出本地回购数据?

    如果不能这样做,我如何更改方案以获得相同的方案?

  • 共有1个答案

    松嘉颖
    2023-03-14

    您不能使用OneError继续流<“代码>onError”表示发生了严重错误,可观察到的错误结束。你不能用它。

    有一个简单的解决方案。您可以将结果包装在指示错误/数据的结构中。例如。

    sealed class MyData
    data class Success(val data: List<Repo>) : MyData
    data class Error(val t: Throwable): MyData
    

    您可以将成功的API响应映射到成功,如果出现错误(在onErrorResumeNext中),您可以创建Error类并使用concat继续使用本地存储库列表。

    这样,您可以在onNext中获得错误和成功,并且不会打破链条。

    onNext中,您可以在时使用并适当地处理错误/成功。

     类似资料:
    • 我正在与之通信的服务器可以选择将多个调用加入到一个中。所以假设我加入2。。n个调用到一个调用中,响应可以检索0。。n个错误。有没有办法在一次一次性使用中避免多个错误?

    • 运算符在可观察的末尾发出值(完成时)。 我正在寻找一种在中使用的方法。当外部可观察对象发出值或完成时,我想要无限内部可观察值的。 此图说明了想要的行为:

    • 问题内容: 我正在尝试将JSON发送到elasticSearch。我尝试使用Postman和SOAPUI数据是 我回来了以下错误 但是当我发布单个JSON数组即 然后工作正常。我是ElasticSearch的新手,所以不确定出什么问题。 问题答案: 首先尝试使用大括号,然后为数组命名。尝试一下,看看是否可行。 例如: 可能有效,因为它包含在对象内部。 更好 在尝试时,我发现它可以将数组隐式转换为J

    • 问题内容: 我读了一些将jsons发布到服务器的示例。 有人说: OkHttp是Java提供的HttpUrlConnection接口的实现。它提供用于编写​​内容的输入流,并且不知道(或不在乎)内容的格式。 现在,我想用名称和密码的参数对URL进行常规发布。 这意味着我需要自己将名称和值对编码为流? 问题答案: 当前接受的答案已过期。现在,如果您想创建一个发布请求并向其中添加参数,则应该使用Mul

    • 我有一个发出随机位/布尔值的可观察对象。我需要制作另一个可观察对象,它结合这些随机位来创建和发出随机整数。每次底层的可观察对象发出一个位时,这个可观察对象都会将该位附加到一个位字符串中,一旦该位字符串达到特定长度,这个可观察对象会将其转换为一个整数并发出它。 下面是我如何使用Android LiveData实现它的: 如何使用RxJava 2实现这一点?

    • 我正在使用RxJava和和操作符: 返回从缓存列表构建的可观察,而方法使用Retrofit获取实体。 除非两个用户快速订阅返回的可观察对象,否则这非常有效。我猜在进行第二次订阅时,第一次订阅的网络请求没有完成。在这种情况下,执行了两个网络请求。我想避免。 我尝试创建一个单线程调度程序,以便仅在第一次调用结束时执行第二次调用,但没有运气: 以及: 我曾尝试将subscribeOn调用放在可观察链的较