java - 如何使用 OKHTTP 进行并发网络请求?

标签 java android multithreading concurrency okhttp

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

基本上这是我想做的:

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

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

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

最佳答案

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

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

对于问题的第二部分,您可以使用 CountdownLatch,也可以桥接到 java Futures,例如 following

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 的方法

注意如果您使用 Futures 进行包装,则在失败时很容易不关闭 Response 对象。

关于java - 如何使用 OKHTTP 进行并发网络请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41833314/

相关文章:

java - Dispatcher Servlet 是一个真正的 servlet

c# - 这个 StaticRandom 类是线程安全的吗?

java - ExecutorService - 执行具有特定时间限制的每个任务

java - 设置 TextView 文本时应用程序卡住

java - GWT 2 ButtonCell 在一行中添加事件

java - Apache tika,在 MailContextHandler 中读取已解析的正文

java - 如何在 AlertDialog 中访问文本的 android 中的字符串资源

android - 更改 Android 音量条

android - 如何显示消息的实时进度?使用什么数据结构/ View ?

javascript - 是否可以在 Chrome for Android 中以编程方式显示 URL 栏?