HTTP 2.0ベースのクライアントを実装するためにokhttp(3.4.1)を使用しようとしています。私の要件の1つは、応答を後で処理するコールバックを使用して、複数の非同期HTTP要求を異なるURLに実装することです。 しかし、私の現在の実装では、最初にメインスレッドからHTTPリクエストをブロックしない限り、すべての非同期リクエストが同じTCP接続を使用することはできません。 私は、非同期呼び出しに使用されるenque()メソッドがディスパッチャを利用して、各リクエストに対して新しいスレッドを生成しているようだと思います。okhttp3で複数の非同期HTTP 2.0リクエストを作成する
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();
}
});
}
私の同期GETリクエストを次のとおりです。:
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;
}
呼び出しシーケンスなどを作り、次のように
OkHttpClient client = new OkHttpClient();
マイ非同期GETリクエスト方法が見えます: はここに私のコードスニペットです次のようにすると、サーバーへの2つのTCP接続がトリガーされます。
AsyncGet(Url);
AsyncGet(Url2);
ただし、次のような呼び出しシーケンスでは、同じTCP接続が使用されます。
SyncGet(Url);
AsyncGet(Url);
AsyncGet(Url2);
私はこれをデバッグしていないが、それはOkHttpはおそらくTCP接続コンテキストを取得するために最初のメインスレッド上のブロッキングHTTPリクエストを行い、その後、他のスレッドでそれを共有するために私たちを強制的にのように見えますか?または、私は何かを逃していますか?
はhttp://stackoverflow.com/questions/32625035/when-using-http2-in-okhttp-why-multi-requests-to-the-same-host-didnt-と同じ問題のように見えますuse-just – vijaygos