Получение исключения тайм-аута сокета с несколькими одновременными сетевыми вызовами - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть требование сделать несколько вызовов API параллельными на моем экране. Я заметил странную проблему с этим. Когда я получаю исключение тайм-аута сокета для одного вызова API, другие параллельные вызовы также получают то же исключение. Если я проверю другие звонки, они работают нормально. Не уверен, что именно проблема. Вот мой код.

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

Может ли кто-нибудь помочь мне в этом?

1 Ответ

0 голосов
/ 04 ноября 2019

Я обнаружил проблему, я определил объект клиента Retrofit как синглтон. Если я создаю экземпляр для каждого вызова, он работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...