Retrofit 根据服务器响应重复2.0 api调用

Retrofit 根据服务器响应重复2.0 api调用,retrofit,rx-java,retrofit2,rx-android,rx-java2,Retrofit,Rx Java,Retrofit2,Rx Android,Rx Java2,使用RxJava2(版本:2.0.0)对OkHTTP3(版本:3.9.0)和RxJava2(版本:2.0.0)进行改造 RESTAPI调用的场景 Observable<ServerResponse> backendService.isUserVerified("someuserName") 如果未验证用户,则预期成功响应JSON POJO { user: "someUserName", isVerified: "yes" } { user: "someUs

使用RxJava2(版本:2.0.0)对OkHTTP3(版本:3.9.0)和RxJava2(版本:2.0.0)进行改造

RESTAPI调用的场景

 Observable<ServerResponse> backendService.isUserVerified("someuserName") 
如果未验证用户,则预期成功响应JSON POJO

{

  user: "someUserName",

  isVerified: "yes"

}
{

  user: "someUserName",

  isVerified: "no"

}
下面是我试图实现的代码

 backendService.isUserVerified("someuserName")
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())

  //Want to add a flatmap (or some other operator)
  .flatmap(new Function<ServerResponse>, ObservableSource<?>>(){
            @Override
            public ObservableSource<?> apply(ServerResponse serverResponse) throws Exception {
                if(0 != serverResponse.getisVerified.compareToIgnoreCase("yes")) {
                return Observable.error(new CustomException());
             }
             return //current observable.
  }

 .retryWhen(mRetryHandler)
 .subscribeWith(observer);
backendService.isUserVerified(“someuserName”)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//要添加平面图(或其他操作符)
.flatmap(新函数,ObservableSource>(){
@凌驾
公共ObserveSource apply(ServerResponse ServerResponse)引发异常{
如果(0!=serverResponse.getisVerified.compareToIgnoreCase(“是”)){
返回Observable.error(新的CustomException());
}
返回//当前可观察到的。
}
.retryWhen(EtryHandler先生)
.主席(观察员);
其目的是在verified==no时抛出一个自定义异常,以便retryWhen()操作符可以插入以重复调用链,否则希望继续通过该链直到subscribe()

有任何提示/帮助吗?

您可以直接使用而不是
flatmap

backendService.isUserVerified("someuserName")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

//we can throw an exception if the user is not verified or keep the response as it is otherwise
.doOnNext(serverResponse -> {
                        if(0 != serverResponse.getisVerified.compareToIgnoreCase("yes")) 
                        {
                            throw new CustomException();
                        }
                    })

.retryWhen(mRetryHandler)
.subscribeWith(observer);
运算符只对发出的项执行一个函数,而不更改它。您只希望在基于项的特定情况下抛出一个错误,否则不更改它,因此它是一个合适的运算符。因为在下一个运算符中使用项之前,您不更改
doOnNext
运算符之前或之后的线程r您知道它将在继续之前抛出异常,以防它应该抛出异常

以下是操作员链接文档中的一个示例:

可观察。仅(1,2,3)
.doOnNext(新行动1){
@凌驾
公共作废调用(整数项){
如果(项目>1){
抛出新的RuntimeException(“项超过最大值”);
}
}
}).subscribe(新订户(){
@凌驾
public void onNext(整数项){
System.out.println(“下一步:+项);
}
@凌驾
公共无效onError(可丢弃错误){
System.err.println(“错误:+Error.getMessage());
}
@凌驾
未完成的公共无效(){
System.out.println(“序列完成”);
}
});
[输出:]

下一个:1

错误:项目超出最大值

您可以直接使用而不是
flatmap

backendService.isUserVerified("someuserName")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

//we can throw an exception if the user is not verified or keep the response as it is otherwise
.doOnNext(serverResponse -> {
                        if(0 != serverResponse.getisVerified.compareToIgnoreCase("yes")) 
                        {
                            throw new CustomException();
                        }
                    })

.retryWhen(mRetryHandler)
.subscribeWith(observer);
运算符只对发出的项执行一个函数,而不更改它。您只希望在基于项的特定情况下抛出一个错误,否则不更改它,因此它是一个合适的运算符。因为在下一个运算符中使用项之前,您不更改
doOnNext
运算符之前或之后的线程r您知道它将在继续之前抛出异常,以防它应该抛出异常

以下是操作员链接文档中的一个示例:

可观察。仅(1,2,3)
.doOnNext(新行动1){
@凌驾
公共作废调用(整数项){
如果(项目>1){
抛出新的RuntimeException(“项超过最大值”);
}
}
}).subscribe(新订户(){
@凌驾
public void onNext(整数项){
System.out.println(“下一步:+项);
}
@凌驾
公共无效onError(可丢弃错误){
System.err.println(“错误:+Error.getMessage());
}
@凌驾
未完成的公共无效(){
System.out.println(“序列完成”);
}
});
[输出:]

下一个:1

错误:项目超出最大值


如果要使用
Observable.error(new CustomException());
抛出错误,则无需使用函数为错误返回特定对象,为预期答案返回另一个对象,这是一个异常,将转到
onError()
方法。您的
observateresource
必须返回在
onResponse()
方法中从
Subscriber
检索到的预期答案。如果您使用
observatable.error()
抛出错误,您的链将断开,错误将转到
onError()

编辑

您应该使用
retry
函数,因为它将返回您的
ServerResponse
,您可以检查它是否有效。使用
retryWhen
,您只会在出现错误时收到错误。在您的情况下,您不会收到任何错误,而是得到答案。在这种情况下,您不需要
flatMap

.retry(new BiPredicate<ServerResponse, Throwable>() {
           @Override
           public boolean test(ServerResponse serverResponse, Throwable throwable) throws Exception {
               return serverResponse.getisVerified.equals("no");
           }
     })
。重试(新的BiPredicate(){
@凌驾
公共布尔测试(ServerResponse ServerResponse,Throwable Throwable)引发异常{
返回serverResponse.getisVerified.equals(“否”);
}
})

如果您想使用
Observable.error(new CustomException());
抛出一个错误,您不需要使用函数为错误返回一个特定对象,为预期答案返回另一个对象,这是一个异常,将转到
onError()
方法。您的
observateresource
必须返回在
onResponse()
方法中从
Subscriber
检索到的预期答案。如果您使用
observatable.error()
抛出错误,您的链将断开,错误将转到
onError()

编辑

您应该使用
retry
函数,因为它将返回您的
ServerResponse
,您可以检查它是否有效。使用
retryWhen
,您只会在出现错误时收到错误。在您的情况下,您不会收到任何错误,而是得到答案。在这种情况下,您不需要
flatMap

.retry(new BiPredicate<ServerResponse, Throwable>() {
           @Override
           public boolean test(ServerResponse serverResponse, Throwable throwable) throws Exception {
               return serverResponse.getisVerified.equals("no");
           }
     })
。重试(新的BiPredicate(){
@凌驾
公共布尔测试(ServerResponse ServerResponse,Throwable Throwable)引发异常{
返回serverResponse.getisVerified.equals(“否”