Tengo el requisito de hacer varias llamadas api paralelas en mi pantalla. Noté un problema extraño con esto. Cuando obtengo la excepción de tiempo de espera de socket para una llamada api, las otras llamadas paralelas también obtienen la misma excepción. Si pruebo las otras llamadas, están funcionando bien. No estoy seguro de cuál es el problema exacto. Aquí está mi código.

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

¿Puede alguien ayudarme en esto?

0
Kameswari 4 nov. 2019 a las 10:52

1 respuesta

Identifiqué el problema, definí el objeto de cliente Retrofit como singleton. Si creo la instancia para cada llamada, funciona bien.

-1
Kameswari 4 nov. 2019 a las 08:48