gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:07:28 24 4
gpt4 key购买 nike

我在 MVP 解决方案中使用 RxJava,我想实现此场景:

  • 尝试获取服务器数据,如果成功,则使用服务器数据填充 View

  • 如果由于任何原因(无互联网 - 服务器无法访问 - 服务器内部错误)而失败,显示适当的消息,但也会使用缓存数据填充 View 。

约束:

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

  • 我不想直接从 Presenter 访问本地存储库

我尝试过:

在我的仓库中:

    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时,可观察的源会发生变化,但永远不会发出错误

如何先发出错误,然后发出本地存储库数据?

如果不能这样完成,我怎样才能改变我的场景以获得相同的场景?

最佳答案

您不能使用 onError 并继续流。 onError 表示发生了严重错误并且 Observable 结束。您无法使用它。

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

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

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

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

onNext 中,您可以使用 when 并适本地处理错误/成功。

关于java - 如何使用 RxJava 发出错误然后发出缓存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50544840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com