Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中使用rxJava和改型进行轮询并读取http错误消息_Java_Android_Retrofit_Retrofit2_Polling - Fatal编程技术网

在Android中使用rxJava和改型进行轮询并读取http错误消息

在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

我对rxJava和改型都是新手,它让我感觉很舒服。 我正在尝试每5秒轮询一个API以获取访问令牌。(这是一款Fire TV应用程序,要求用户通过输入访问代码登录网页。) 此外,我需要读取HTTP错误消息,而不仅仅是获取状态代码。 例:400个访问被拒绝, 400慢下来, 400个授权单元待定, 400欧元代币

以下是相关的进口商品:

    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()”);
完成();
}
});