Я пытаюсь использовать okhttp (3.4.1) для реализации клиента на основе HTTP 2.0. Часть моего требования заключается в реализации нескольких асинхронных HTTP-запросов на разные URL-адреса с обратным вызовом для обработки ответа позднее. Однако, с моей текущей реализацией, я вижу, что я не могу заставить все мои асинхронные запросы использовать одно и то же TCP-соединение, если только я не сделаю блокирующий HTTP-запрос из моего основного потока в начале. Я понимаю, что метод enque(), используемый для асинхронных вызовов, включает диспетчера, который, кажется, порождает новый поток для каждого из запросов. Вот мой фрагмент кода:Создание нескольких асинхронных запросов HTTP 2.0 с okhttp3
OkHttpClient client = new OkHttpClient();
Мой асинхронной Get Request метод выглядит следующим образом:
public void AsyncGet(String url) throws Exception {
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
new Thread() {
@Override
public void run() {
/* Some code */
}
}.start();
}
});
}
Мой синхронное Получить запрос выглядит следующим образом:
public Response SyncGet(String url) throws Exception {
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
Response response = call.execute();
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
return response;
}
Посылка последовательность вызовов, как следующие триггеры 2 TCP-соединения с сервером.
AsyncGet(Url);
AsyncGet(Url2);
Однако последовательность вызовов, такая как следующая, использует одно и то же соединение TCP.
SyncGet(Url);
AsyncGet(Url);
AsyncGet(Url2);
Я не отлажена это, но, похоже, OkHttp заставляет нас сделать запрос на блокирование HTTP на главном потоке первых, чтобы, возможно, получить контекст соединения TCP, а затем поделиться этим с другими потоками? Или я чего-то не хватает?
Похоже, тот же вопрос, как http://stackoverflow.com/questions/32625035/when-using-http2-in-okhttp-why-multi-requests-to-the-same-host-didnt- use-just – vijaygos