【问题标题】:How to make concurrent network requests using OKHTTP?如何使用 OKHTTP 发出并发网络请求?
【发布时间】:2017-06-09 13:18:29
【问题描述】:

我正在寻找使用 OKHTTP 库发出并发网络请求的最佳实践。

基本上这是我想做的:

我想写一个方法,向不同的 URL 发出 N 个并发网络请求,并且仅在所有 N 个请求都返回时才返回。

我考虑过手动编写线程和可运行对象等来创建一组请求池,但想知道是否有某种更简单的方法可以做到这一点。所以我的问题是:

  1. OKHTTP 是否以某种方式原生支持并发请求 API?
  2. 如果不是,最好的实现方式是什么?

【问题讨论】:

  • RxJava 围绕 OkHttp 可以帮助你
  • 你也可以使用countDownLatch,用N初始化它并在非UI线程中使用await,因为这会阻塞你的线程,然后在每个请求的成功调用countDown,在@之后987654324@做你想做的事。

标签: java android multithreading concurrency okhttp


【解决方案1】:

OkHttp 原生有效地支持异步请求,例如共享最佳连接数。

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/AsynchronousGet.java

对于问题的第二部分,您可以使用 CountdownLatch 或者您可以像 following 那样桥接到 java Futures

public class OkHttpResponseFuture implements Callback {
  public final CompletableFuture<Response> future = new CompletableFuture<>();

  public OkHttpResponseFuture() {
  }

  @Override public void onFailure(Call call, IOException e) {
    future.completeExceptionally(e);
  }

  @Override public void onResponse(Call call, Response response) throws IOException {
    future.complete(response);
  }
}

然后调用

  private Future<Response> makeRequest(OkHttpClient client, Request request) {
    Call call = client.newCall(request);

    OkHttpResponseFuture result = new OkHttpResponseFuture();

    call.enqueue(result);

    return result.future;
  }

此时你可以使用CompletableFuture.allOf之类的方法

n.b.如果您使用 Futures 进行包装,当一个失败时不关闭 Response 对象是很容易的。

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 2017-06-17
    • 2014-06-20
    • 1970-01-01
    • 2021-05-28
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多