您可以使用Transformer
为了创建通用状态代码验证器:
class StatusCodeVerifierTransformer<T> implements Observable.Transformer<Response<T>, T> {
@Override
public Observable<T> call(Observable<Response<T>> responseObservable) {
return responseObservable.flatMap(new Func1<Response<T>, Observable<T>>() {
@Override
public Observable<T> call(Response<T> loginResponse) {
switch (loginResponse.code()) {
case 200:
return Observable.just(loginResponse.body());
case 202:
//need to Repeat
return Observable.error(new Status202Exception());
default:
return Observable.error(new Exception("unknown error"));
}
}
});
}
}
该变压器将采取任何Observable
of Response<T>
并将其转换为Observable
of T
,根据您的策略发出错误。
然后将其与compose()
操作员:
Observable<Login> login(String l, String p) {
return api.loginUser(l, p)
.compose(new StatusCodeVerifierTransformer<>())
}
现在你有一个Observable
会发出onError
根据您的状态代码处理您想要的异常。
现在,您可以像任何错误一样重试错误Observable
with retry
运算符,例如这样:
api.loginUser(l, p)
.compose(new StatusCodeVerifierTransformer<>())
.retry(new Func2<Integer, Throwable, Boolean>() {
@Override
public Boolean call(Integer retryCount, Throwable throwable) {
return throwable instanceof Login202Exception && retryCount < MAX_RETRY;
}
})
BTW,一些评论:
requestOk - 你绝对不需要创建Observable
要发出一次特定值,只需使用just()
运算符,就像在StatusCodeVerifierTransformer
例子。 (或者对于任何其他同步操作,您有很多运算符,例如fromCallable()
, just()
, from()
)
一般来说,create()
不是一种安全的创建方法Observable
不再了。