使用 rxjava 避免 OVER_QUERY_LIMIT

Posted

技术标签:

【中文标题】使用 rxjava 避免 OVER_QUERY_LIMIT【英文标题】:Avoid OVER_QUERY_LIMIT with rxjava 【发布时间】:2019-01-15 15:09:54 【问题描述】:

在将 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)

我为 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);

【问题讨论】:

【参考方案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() 可以让您根据错误类型调整您的反应。

【讨论】:

以上是关于使用 rxjava 避免 OVER_QUERY_LIMIT的主要内容,如果未能解决你的问题,请参考以下文章

retrofit+RXjava二次封装

打造RxJava生命周期管理框架RxLife

从源码的角度去探索RxJava笔记

从源码的角度去探索RxJava笔记

Rxjava - 如何获取当前和上一个项目?

RxJava入门之路