httpclient.client.httpresponseexception:请求太多

vecaoik1  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(501)

我创建了一个从googlebooksapi读取数据并在recyclerview中显示的应用程序。
有时回收视图中的项目不会显示。
在我的日志中,我得到以下信息(这不是导致我的应用程序崩溃的错误,但它显示了这一点):

V/AsyncHttpRH: Progress 538 from 1 (53800%)
W/JsonHttpRH: onFailure(int, Header[], Throwable, JSONObject) was not overriden, but callback was received
    cz.msebera.android.httpclient.client.HttpResponseException: Too Many Requests
        at com.loopj.android.http.AsyncHttpResponseHandler.sendResponseMessage(AsyncHttpResponseHandler.java:446)
        at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:160)
        at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:177)
        at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:106)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

什么会导致这个错误?
我使用它的方式是:

MyBookClient.getInstance().getBooks( discoverBooks.getBookID(), new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                if (response != null) {
                    final MyBook books = MyBook.fromJson( response );
                }
            }
        } );

哪里:
公共类mybookclient{

private static final String API_BASE_URL = "https://www.googleapis.com/books/v1/volumes/";
private AsyncHttpClient client;

public static MyBookClient instance = new MyBookClient();

public MyBookClient() {
    this.client = new AsyncHttpClient();
}

public static MyBookClient getInstance() {
    return instance;
}

public void getBooks(final String query, JsonHttpResponseHandler handler) {
    try {
        client.get( API_BASE_URL + URLEncoder.encode( query, "utf-8" ), handler );
    } catch (UnsupportedEncodingException ignored) {

    }
}

}
谢谢您!

kxkpmulp

kxkpmulp1#

可能你的应用程序在短时间内发出了很多请求,因此消除错误429的最佳策略是实施控制策略:
你可以使用去抖动或节流(将取决于什么适合你的情况);
实现一个等待请求队列以在延迟时间内传递,以避免429错误。
当您确实需要发出此请求时,请在应用程序中进行Map,因此创建一个作业以验证何时考虑了标准。
在所有情况下,您都可以以异步方式执行,传递作业或事件订阅实现,以便将图书数据注入页面或其他内容。

相关问题