Vlad
Vlad

Reputation: 8268

How to make concurrent network requests using OKHTTP?

I'm looking for a best practice for making concurrent network requests using the OKHTTP library.

Basically here's what I want to do:

I want to write a method that makes N concurrent network requests to different URLs, and return ONLY when ALL N requests have returned.

I thought about manually writing Threads and Runnables and such to create a group of request pool, but was wondering if there's some sort of easier way to do this. So my question is:

  1. Does OKHTTP support concurrent request API natively somehow?
  2. If not, what's the best way to implement this?

Upvotes: 10

Views: 9575

Answers (1)

Yuri Schimke
Yuri Schimke

Reputation: 13448

OkHttp natively supports asynchronous requests efficiently e.g. sharing the optimum number of connections.

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

For the second part of the question, you use a CountdownLatch or you can bridge to java Futures like the 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);
  }
}

And call

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

    OkHttpResponseFuture result = new OkHttpResponseFuture();

    call.enqueue(result);

    return result.future;
  }

At that point you can use methods like CompletableFuture.allOf

n.b. if you wrap with Futures, it can be easy to not close the Response objects when one fails.

Upvotes: 17

Related Questions