使用rxjava避免OVER_QUERY_LIMIT

时间:2018-08-08 11:10:23

标签: android rx-java retrofit rx-android okhttp3

将Place API与rxjava一起使用时,我看到一个问题。

以如此快的速度获取数据时,api返回"status" : "OVER_QUERY_LIMIT"。 我想重复获取具有特定延迟时间的数据,以免发生这种情况。如何使用rxjava运算符进行操作。

getCompositeDisposable().add(
    getDataManager().getAtmsByBankName(nameSearch, location, radius, apiKey)
    .subscribeOn(getSchedulerProvider().io())
    .observeOn(getSchedulerProvider().ui())
    .subscribe(atmResponse -> {
        if (atmResponse.getStatus().equals("OK")) {
            if (atmResponse.getAtmList() != null) {
                atmListLiveData.setValue(atmResponse.getAtmList());
            }
        }
        Log.e("LOG", "inside onNext");
     }, throwable -> {
         getNavigator().handleError(throwable);
         Log.e("LOG", "inside onError");
     }));

这是带有okhttp3的日志:

D/OkHttp: {
   "error_message" : "You have exceeded your daily request quota for this API.",
   "html_attributions" : [],
   "results" : [],
   "status" : "OVER_QUERY_LIMIT"
}
<-- END HTTP (166-byte body)

我将Retrofit用于http。

public Observable<ATMResponse> getAtmsByBankName(String nameSearch, String location, String radius, String apiKey) {
    ApiInterface apiInterface = retrofit.create(ApiInterface.class);
    //return apiInterface.getAtms(nameSearch, location, radius, apiKey);
    return apiInterface.getAtms(nameSearch, location, radius, apiKey);
}

1 个答案:

答案 0 :(得分:1)

发生错误时,您可以使用retryWhen()运算符重新订阅源。由于来自您来源的回复是正常的,因此您必须将其转换为错误条件:

.doOnNext( atmResponse -> {if ( !atmResponse.getStatus().equals("OK") ) {
                             throw new IllegalStateException();
                          })

(然后添加任何进一步的测试,以确保您具有正确的错误类型) 一旦出现错误,您就可以使用retryWhen()重试:

.retryWhen( throwable -> throwable.flatMap( t -> Observable.timer( 1, TimeUnit.SECONDS ) ) )

retryWhen()将发出它捕获的throwable,并根据结果确定其响应。如果发出一个值,则它将重新订阅源;如果发出onComplete()onError(),则订阅将正常完成。使用flatMap()可让您根据错误类型调整反应。