繁体   English   中英

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

[英]How to make concurrent network requests using 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, 如下所示

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对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM