【发布时间】:2016-02-09 17:20:20
【问题描述】:
在我的Android 项目中,我做了很多网络请求(使用Retrofit 和RxJava),这些请求作为响应返回一个自定义的响应超类型,它可以包含有效或错误响应。
AppResponse {
error=AppError {
code=12345,
message='null'
},
data=null
}
错误代码不是 HTTP 错误代码,而是通过使用 SimpleXML 解析 XML 结果检索到的内容。对于所有网络请求,大约有 4-5 个错误代码相同,例如会话超时等。因此,我会编写一个通用方法来检查这些错误代码的所有响应并设置对策,例如请求新会话。
首先我考虑使用OkHttpInterceptor,但是因为我需要将结果解析为正确的格式,所以我不能使用它。
我在解析结果后使用RxJava,目前我正在 subscribe 方法中检查我的结果的响应。
restClient.requestHostList()
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<HostListResponse>() {
@Override
public void onError() {
}
@Override
public void onCompleted() {
}
@Override
public void onNext(HostListResponse hostListResponse) {
if (hostListResponse.isError()) {
if(hostListResponse.getError().getCode() == 12345) {
requestNewSession();
} else if(hostListResponse.getError().getCode() == 23456) {
requestNewLogin();
}
else {
//do some UI stuff here
}
我不确定如何在此处继续,是否有类似Transformer 的东西可用于订阅以验证结果并可能启动另一个网络请求,或者在到达订阅者之前启动它会更好吗?我还在想如果 onErrorResumeNext() 可以通过让 Observable 在未通过结果代码测试时抛出错误来成为一个选项,如下所示:
restClient.requestHostList()
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<HostListResponse, Observable<Throwable>>() {
@Override
public Observable<Throwable> call(HostListResponse hostListResponse) {
if (hostListResponse.isError()) {
if(hostListResponse.getError().getCode() == 12345) {
throw new Exception();
}
}
}
})
.onErrorResumeNext(new Func1<Throwable, Observable<? extends Throwable>>() {
//do error handling here
})
【问题讨论】: