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?

0
Kameswari 4 nov. 2019 à 10:52

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.

-1
Kameswari 4 nov. 2019 à 08:48