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

时间:2018-05-26 16:29:51

标签: java android kotlin rx-java mvp

我在MVP解决方案中使用RxJava,我希望实现这种情况:

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

  • 如果由于任何原因失败(没有互联网 - 服务器无法访问 - 服务器内部错误)显示相应的消息,而且还使用缓存数据填充视图。

约束:

  • 我不想使用任何额外的回调(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时,可观察源会发生变化但永远不会发出错误

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

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

1 个答案:

答案 0 :(得分:2)

您无法使用onError并继续播放该流。 onError表示发生了严重错误,Observable结束。你无法使用它。

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

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并正确处理错误/成功。