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.
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();