当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用OKHTTP发出并发网络请求?》经验,为你挑选了1个好方法。

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

基本上,这就是我想要做的:

我想编写一种方法,使N个并发网络请求发送到不同的URL,并且仅在所有N个请求都返回后才返回。

我考虑过手动编写Threads和Runnables之类的方法来创建一组请求池,但是我想知道是否存在某种更简单的方法来执行此操作。所以我的问题是:

    OKHTTP是否以某种方式原生支持并发请求API?

    如果没有,实现此目标的最佳方法是什么?

Yuri Schimke.. 6

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 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 makeRequest(OkHttpClient client, Request request) {
    Call call = client.newCall(request);

    OkHttpResponseFuture result = new OkHttpResponseFuture();

    call.enqueue(result);

    return result.future;
  }

届时,您可以使用CompletableFuture.allOf之类的方法

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



1> Yuri Schimke..:

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 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 makeRequest(OkHttpClient client, Request request) {
    Call call = client.newCall(request);

    OkHttpResponseFuture result = new OkHttpResponseFuture();

    call.enqueue(result);

    return result.future;
  }

届时,您可以使用CompletableFuture.allOf之类的方法

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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有