避免 OVER_QUERY_LIMIT 与 rxjava
Avoid OVER_QUERY_LIMIT with rxjava
我在将 Place API 与 rxjava 一起使用时发现问题。
这么快取数据的时候,apireturn"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)
我对 http 使用 Retrofit。
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);
}
发生错误时,您可以使用 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()
可让您根据错误类型调整反应。
我在将 Place API 与 rxjava 一起使用时发现问题。
这么快取数据的时候,apireturn"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)
我对 http 使用 Retrofit。
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);
}
发生错误时,您可以使用 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()
可让您根据错误类型调整反应。