如何发出错误然后使用 RxJava 发出缓存数据?
how to emit error then emit the cached data using RxJava?
我在 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
时,可观察到的源发生了变化,但 永远不会发出错误 。
如何先发出错误然后发出本地回购数据?
如果不能这样做,我怎样才能改变我的场景以获得相同的场景?
您无法使用 onError
继续直播。 onError
表示发生严重错误,Observable
结束。你不能使用它。
有一个简单的解决方案。您可以将结果包装在指示 error/data 的结构中。例如
sealed class MyData
data class Success(val data: List<Repo>) : MyData
data class Error(val t: Throwable): MyData
您可以将成功的 API 响应映射到 Success
,如果出现错误(在 onErrorResumeNext
中),您可以创建一个 Error
class并使用 concat
继续本地回购列表。
这样,您在 onNext
中既会出错又会成功,并且不会破坏链条。
在 onNext
中,您可以使用 when
并适当地处理 error/success。
我在 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
时,可观察到的源发生了变化,但 永远不会发出错误 。
如何先发出错误然后发出本地回购数据?
如果不能这样做,我怎样才能改变我的场景以获得相同的场景?
您无法使用 onError
继续直播。 onError
表示发生严重错误,Observable
结束。你不能使用它。
有一个简单的解决方案。您可以将结果包装在指示 error/data 的结构中。例如
sealed class MyData
data class Success(val data: List<Repo>) : MyData
data class Error(val t: Throwable): MyData
您可以将成功的 API 响应映射到 Success
,如果出现错误(在 onErrorResumeNext
中),您可以创建一个 Error
class并使用 concat
继续本地回购列表。
这样,您在 onNext
中既会出错又会成功,并且不会破坏链条。
在 onNext
中,您可以使用 when
并适当地处理 error/success。