我正在寻找使用OKHTTP库进行并发网络请求的最佳做法。
基本上这就是我想做的事情:
我想编写一个方法,对不同的网址发出N个并发网络请求,并且仅在返回所有N个请求时返回。
我考虑过手动编写Threads和Runnables等创建一组请求池,但是想知道是否有更简单的方法来执行此操作。所以我的问题是:
答案 0 :(得分:5)
OkHttp本身支持有效的异步请求,例如分享最佳连接数。
对于问题的第二部分,您使用CountdownLatch,或者您可以桥接到Java期货,例如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
等方法n.b。如果你用Futures包装,当一个失败时很容易关闭Response对象。