【问题标题】:httpclient.client.HttpResponseException: Too Many Requestshttpclient.client.HttpResponseException:请求太多
【发布时间】:2021-07-15 00:48:21
【问题描述】:

我创建了一个从 Google Books API 读取数据并将其显示在 recyclerView 中的应用。

有时 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) {

    }
}

}

谢谢!

【问题讨论】:

  • 应用程序有连续请求的流程吗?尝试在这些请求之间添加延迟,我想它现在可以解决。
  • 但这是一个异步任务。如何控制它?

标签: java android android-asynctask loopj google-books


【解决方案1】:

可能您的应用在短时间内发出大量请求,因此摆脱错误 429 的最佳策略是实施控制它的策略:

  1. 您可以使用debouncing or throttling(取决于您的情况);
  2. 实现待处理请求队列以延迟交付以避免 429 错误。
  3. 当您确实需要发出此请求时在您的应用中进行映射,因此请创建一个作业来验证何时考虑了标准。

在所有情况下,您都可以以异步方式执行操作,交付作业或事件订阅实现以在页面上注入图书数据或其他内容。

【讨论】:

  • 有什么方法可以知道每个请求之间延迟多少?
  • 只是测试,我认为是最好的方法,增加它直到您的应用不再显示错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多