web-dev-qa-db-ja.com

okhttpアプリケーションレベルのOkHttpClientインスタンス

「Androidアプリケーション全体」を提供するためにOkHttpClientのインスタンスを1つ作成すると、パフォーマンスのボトルネックや問題が発生するかどうか疑問に思いました。つまり、Applicationクラスで、静的パブリック変数を作成します。 OkHttpClientのインスタンスが含まれ、httpリクエストを実行する必要がある場合は常に、基本的にリクエストオブジェクトを作成し、作成されたokhttpclientインスタンスを使用してリクエストを実行します。

このようなコード

public class MyApplication extends Application {
    public static OkHttpClient httpClient;

    @Override
    public void onCreate() {
        super.onCreate();

        httpClient = new OkHttpClient();
    }

}

// Making request 1
Request request1 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request1).execute();

// Making request 2
Request request2 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request2).execute();
18

単一インスタンスの使用は問題ではなく、一般的な方法です。同様のアプリを github から確認できます。これは、短剣を使用してOkHttpClientをシングルトンにし、他のモジュールに挿入します。

そして、あなたは見ることができます この議論ではJakeWharton もこの種の使用法を示唆しています。

ただし、この目的でシングルトンパターンを使用する方がよいでしょう。

23
bhdrkn

@bhdrknが正しく示唆していることとは別に、OkHttpClientのシングルトンインスタンスが正しい方法であることを明確に確認するには、ドキュメントからの抜粋です。

ソース: https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html

OkHttpClientsを共有する必要があります

OkHttpは、単一のOkHttpClientインスタンスを作成し、それをすべてのHTTP呼び出しに再利用すると最高のパフォーマンスを発揮します。これは、各クライアントが独自の接続プールとスレッドプールを保持しているためです。接続とスレッドを再利用すると、待ち時間が短縮され、メモリが節約されます。逆に、リクエストごとにクライアントを作成すると、アイドルプールのリソースが無駄になります。

OkHttpClientインスタンスを初期化する正しい方法については、Javadoc(上記のリンク)を参照してください。

5
dominik