Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?
like image 894
Vlad Avatar asked Jan 24 '17 16:01

Vlad


Video Answer


1 Answers

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.

like image 200
Yuri Schimke Avatar answered Oct 24 '22 23:10

Yuri Schimke