[JAVA] OkHttp3 sollte Singleton sein

Einführung

Der Verbindungspoolteil hat sich zwischen OkHttp2 und OkHttp3 erheblich geändert. Zitiert aus Änderungsprotokoll.

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!

Wie Sie oben sehen können, wurde der Verbindungspool bis OkHttp2 gemeinsam genutzt, aber ab OkHttp3 verfügt jede Instanz über einen separaten Verbindungspool. Wenn Sie OkHttp weiterhin instanziieren, ohne es zu wissen, erhalten Sie möglicherweise einen OutOfMemoryError. Also sollte OkHttp3 in einer Tonne geschrieben werden.

Beispielcode

Vorerst habe ich es in Tonne geschrieben. Bitte kommentieren Sie, wenn Sie mehr davon tun möchten.

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;
    }
}

Wenn Sie denselben Anforderungsheader verwenden möchten, verwenden Sie den Interceptor von OkHttpClient.

Wenn Sie die OkHttpClient-Einstellungen (Timeout-Zeit usw.) einzeln ändern möchten, schreiben Sie sie mit OkHttpClient.newBuilder () neu.


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

Referenz

Recommended Posts

OkHttp3 sollte Singleton sein
Wie Softwareentwicklungslernen sein sollte
Java Calendar ist kein Singleton.
Um kein statischer Onkel zu sein
Einstellungen, die beim Betrieb einer Produktionsumgebung mit Rails vorgenommen werden sollten