在Android中使用rxJava和改型进行轮询并读取http错误消息
我对rxJava和改型都是新手,它让我感觉很舒服。 我正在尝试每5秒轮询一个API以获取访问令牌。(这是一款Fire TV应用程序,要求用户通过输入访问代码登录网页。) 此外,我需要读取HTTP错误消息,而不仅仅是获取状态代码。 例:400个访问被拒绝, 400慢下来, 400个授权单元待定, 400欧元代币 以下是相关的进口商品:在Android中使用rxJava和改型进行轮询并读取http错误消息,java,android,retrofit,retrofit2,polling,Java,Android,Retrofit,Retrofit2,Polling,我对rxJava和改型都是新手,它让我感觉很舒服。 我正在尝试每5秒轮询一个API以获取访问令牌。(这是一款Fire TV应用程序,要求用户通过输入访问代码登录网页。) 此外,我需要读取HTTP错误消息,而不仅仅是获取状态代码。 例:400个访问被拒绝, 400慢下来, 400个授权单元待定, 400欧元代币 以下是相关的进口商品: implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
我有一个用于实例化改造服务的服务生成器类。这包括一个调用适配器,用于转换为可观察的:
private static Retrofit.Builder builderWithObservable = new Retrofit.Builder().baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
**.addCallAdapterFactory(RxJava3CallAdapterFactory.create())**
.client(okHttp.build());
在API服务类中,我将响应声明为可观察的
@POST("AccessToken")
Observable<AccessTokenResponse> accessToken(@Body AccessTokenRequest request);
@POST(“AccessToken”)
可观察的accessToken(@Body AccessTokenRequest请求);
下面是我活动中使用rxJava改装调用API的代码:
APIService apiService = ServiceBuilder.buildServiceWithObservable(APIService.class);
//Observable<AccessTokenResponse> apiObservable = apiService.accessToken(accessTokenRequest);
Observable.interval(mPollingInterval, TimeUnit.SECONDS, Schedulers.io())
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(response -> apiService.accessToken(accessTokenRequest))
//.subscribe(responseObservable -> responseObservable.subscribe(response -> handleResults(response)), this::handleError);
.subscribe(this::handleResults, this::handleError);
APIService APIService=ServiceBuilder.buildServiceWithObservable(APIService.class);
//Observable apiObservable=apiService.accessToken(accessTokenRequest);
可观察的.interval(mPollingInterval、TimeUnit.SECONDS、Schedulers.io())
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(响应->apiService.accessToken(accessTokenRequest))
//.subscribe(responseObservable->responseObservable.subscribe(response->handleResults(response)),this::handleError);
.subscribe(this::handleResults,this::handleError);
我可以得到一个有效的响应,问题是我不仅需要读取和处理http错误,还需要在错误为“authorization\u pending”时继续轮询API。
如果实例化API服务类,则无法访问interval方法:
Observable<AccessTokenResponse> apiObservable = apiService.accessToken(accessTokenRequest);
apiObservable.interval // does not exist
Observable-apiObservable=apiService.accessToken(accessTokenRequest);
apiObservable.interval//不存在
我见过其他使用旧版本库的帖子,但它们对我不起作用。
请帮忙。我的头发不多了,我要把它全部拔出来
更新:
我没有头发了,但我找到了解决办法。我不知道这是否是最好的解决方案,但它是有效的。
我放弃了读取自定义HTTP错误消息的尝试。我正在查状态码。
我一直认为我需要区间运算符,但我没有。我需要retryWhen接线员
APIService apiService = ServiceBuilder.buildServiceWithObservable(APIService.class);
apiService.accessToken(accessTokenRequest)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(errors -> errors.flatMap(error -> {
if (error instanceof HttpException) {
HttpException httpException = (HttpException)error;
int statusCode = httpException.code();
if (statusCode == 401) {
// if 401 status code, retry
return Observable.timer(mPollingInterval, TimeUnit.SECONDS);
}
}
// For anything else, don't retry
return Observable.error(error);
}))
.subscribe(new Observer<AccessTokenResponse>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull AccessTokenResponse response) {
handleResults(response);
}
@Override
public void onError(@NonNull Throwable e) {
handleError(e);
finish();
}
@Override
public void onComplete() {
System.out.println("onComplete()");
finish();
}
});
APIService APIService=ServiceBuilder.buildServiceWithObservable(APIService.class);
apiService.accessToken(accessTokenRequest)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(错误->错误.flatMap(错误->{
if(HttpException的错误实例){
HttpException HttpException=(HttpException)错误;
int statusCode=httpException.code();
如果(状态代码==401){
//如果是401状态代码,请重试
返回可观察计时器(mPollingInterval,TimeUnit.SECONDS);
}
}
//对于其他内容,请不要重试
返回可观测误差(error);
}))
.订阅(新观察员){
@凌驾
订阅时的公共无效(@NonNull-d){
}
@凌驾
public void onNext(@NonNull AccessTokenResponse){
HandlerResults(响应);
}
@凌驾
公共无效onError(@NonNull可丢弃e){
handleError(e);
完成();
}
@凌驾
未完成的公共空间(){
System.out.println(“onComplete()”);
完成();
}
});