我在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
时,可观察源会发生变化但永远不会发出错误。
如何首先发出错误,然后发出本地回购数据?
如果不能这样做,我怎样才能改变我的场景以获得相同的场景?
答案 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
并正确处理错误/成功。