我正在寻找使用 OKHTTP 库发出并发网络请求的最佳实践。
基本上这是我想做的:
我想编写一个方法,向不同的 URL 发出 N 个并发网络请求,并仅在所有 N 个请求都返回时返回。
我考虑过手动编写 Threads 和 Runnables 等来创建一组请求池,但想知道是否有某种更简单的方法可以做到这一点。所以我的问题是:
- OKHTTP 是否以某种方式原生支持并发请求 API?
- 如果没有,实现它的最佳方法是什么?
最佳答案
OkHttp 原生支持高效的异步请求,例如共享最佳连接数。
对于问题的第二部分,您可以使用 CountdownLatch,也可以桥接到 java Futures,例如 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 的方法
注意如果您使用 Futures 进行包装,则在失败时很容易不关闭 Response 对象。
关于java - 如何使用 OKHTTP 进行并发网络请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41833314/