J'ai besoin de faire plusieurs appels api en parallèle sur mon écran. J'ai remarqué un problème étrange avec cela. Lorsque j'obtiens une exception de délai d'expiration de socket pour un appel API, les autres appels parallèles reçoivent également la même exception. Si je teste les autres appels, ils fonctionnent bien. Je ne sais pas quel est le problème exact. Voici mon code.
// getting ok http client
private static OkHttpClient getUnsafeOkHttpClient() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// Remove cookies from the request
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
cookieManager.getCookieStore().removeAll();
try {
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
OkHttpClient client;
client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.addInterceptor(interceptor)
.cookieJar(new JavaNetCookieJar(cookieManager))
.connectTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) // set the request timeout
.readTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
.hostnameVerifier((hostname, session) -> true)
.build();
client.dispatcher().setMaxRequestsPerHost(20);
client.dispatcher().setMaxRequests(20);
return client;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// making api call
public static void makeNetworkRequest(Call<JSONObject> requestCall, final NetworkListener networkListener){
// define the request callback object
Callback<JSONObject> requestCallback = new Callback<JSONObject>() {
@Override
public void onResponse(Call<JSONObject> call, Response<JSONObject> response) {
networkListener.onSuccess(response);
}
@Override
public void onFailure(Call<JSONObject> call, Throwable t) {
t.printStackTrace();
networkListener.onFailure(CONN_FAILED);
}
};
// make the request
requestCall.enqueue(requestCallback);
}
Quelqu'un peut-il m'aider à ce sujet?
1 réponse
J'ai identifié le problème, j'ai défini l'objet client Retrofit comme singleton. Si je crée l'instance pour chaque appel, cela fonctionne très bien.
De nouvelles questions
android
Android est le système d'exploitation mobile de Google, utilisé pour la programmation ou le développement d'appareils numériques (Smartphones, tablettes, automobiles, téléviseurs, Wear, Glass, IoT). Pour les sujets liés à Android, utilisez des balises spécifiques à Android telles que l'intention d'Android, l'activité d'Android, l'adaptateur Android, etc. Pour les questions autres que le développement ou la programmation, mais liées au cadre Android, utilisez ce lien: https: // android.stackexchange.com.