[JAVA] OkHttp3 devrait être singleton

introduction

La partie du pool de connexions a considérablement changé entre OkHttp2 et OkHttp3. Extrait de Change Log.

There is no longer a global singleton connection pool. In OkHttp 2.x, all OkHttpClient instances shared a common connection pool by default. In OkHttp 3.x, each new OkHttpClient gets its own private connection pool. Applications should avoid creating many connection pools as doing so prevents connection reuse. Each connection pool holds its own set of connections alive so applications that have many pools also risk exhausting memory!

Comme vous pouvez le voir ci-dessus, le pool de connexions a été partagé jusqu'à OkHttp2, mais à partir d'OkHttp3, chaque instance a un pool de connexions séparé. Si vous continuez à instancier OkHttp sans le savoir, vous pouvez obtenir une OutOfMemoryError. Donc OkHttp3 devrait être écrit en une seule tonne.

Exemple de code

Pour le moment, je l'ai écrit en une seule tonne. Veuillez commenter si vous souhaitez faire plus comme ça.

OkHttpSingleton.java



import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpSingleton {

    private OkHttpClient mOkHttpClient;

    private static OkHttpSingleton ourInstance = new OkHttpSingleton();

    public static OkHttpSingleton getInstance() {
        return ourInstance;
    }

    private OkHttpSingleton() {

        OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
        okHttpBuilder.connectTimeout(20, TimeUnit.SECONDS);
        okHttpBuilder.readTimeout(15, TimeUnit.SECONDS);
        okHttpBuilder.writeTimeout(15, TimeUnit.SECONDS);
        okHttpBuilder.addInterceptor(getInterceptor());

        mOkHttpClient = okHttpBuilder.build();
    }

    private Interceptor getInterceptor() {

        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {

                Request newRequest = chain.request().newBuilder()
                        .addHeader("Accept", "application/json")
                        .build();

                return chain.proceed(newRequest);
            }
        };
    }

    public OkHttpClient getOkHttpClient() {
        return mOkHttpClient;
    }
}

Si vous souhaitez utiliser le même en-tête de demande, utilisez l'intercepteur d'OkHttpClient.

Si vous souhaitez modifier individuellement les paramètres OkHttpClient (délai d'expiration, etc.), réécrivez-les en utilisant OkHttpClient.newBuilder ().


OkHttpClient copy = client.newBuilder()
          .readTimeout(500, TimeUnit.MILLISECONDS)
          .build();

référence

Recommended Posts

OkHttp3 devrait être singleton
Comment l'apprentissage du développement logiciel devrait être
Le calendrier Java n'est pas un singleton.
Ne pas être un oncle statique
Paramètres à définir lors de l'exploitation d'un environnement de production avec Rails