Ошибка сокета OkHttp3: EMFILE (слишком много открытых файлов)

Я использую Retrofit 2.0.0. OkHttp 3.1.2. Некоторые из моих пользователей получают следующее исключение:

java.net.SocketException: сокет не выполнен: EMFILE (слишком много открытых файлов) в libcore.io.IoBridge.socket(IoBridge.java:619) ~[na:0.0] в java.net.PlainSocketImpl.create(PlainSocketImpl.java:198) ~[нет: 0,0] на java.net.Socket.checkOpenAndCreate(Socket.java:689) ~[нет: 0,0] на java.net.Socket.setSoTimeout(Socket.java:543) ~[нет: 0,0] на com.android.org.conscrypt.OpenSSLSocketImpl.setSoTimeout(OpenSSLSocketImpl.java:1140) ~[na:0.0] на com.android.org.conscrypt.OpenSSLSocketImplWrapper.setSoTimeout(OpenSSLSocketImpl:1rara): в okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:155) ~[na:0.0] в okhttp3.internal.io.RealConnection.connect(RealConnection.java:111) ~[na:0.0] в okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:188) ~[na:0.0] в okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:127) ~[na:0.0] в okhttp3.internal.httpSt..newStream(StreamAllocation.java:97) ~[na:0.0] в okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:289) ~[na:0.0] в okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:241) ~[na:0.0] в okhttp3.RealCall.getRespon RealCall.java:240) ~[na:0.0] в okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198) ~[na:0.0]

Когда я смотрю на crashlytics, я вижу много запущенных потоков:

на com.android.org.conscrypt.NativeCrypto.SSL_read(NativeCrypto.java) на com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:811) на okio.Okio$2.read(Okio.jj). 139) в okio.AsyncTimeout$2.read(AsyncTimeout.java:211) в okio.RealBufferedSource.request(RealBufferedSource.java:71) в okio.RealBufferedSource.require(RealBufferedSource.java:64) в okio.RealBufferedSource.java:232) на okhttp3.internal.framed.Spdy3$Reader.nextFrame(Spdy3.java:129) на okhttp3.internal.framed.FramedConnection$Reader.execute(FramedConnection.java:600) на okhttp3.internal.NamedRunnable. выполнить (NamedRunnable.java:32) в java.lang.Thread.run(Thread.java:818)

Я запускаю Okhttp только один раз в моем приложении следующим образом:

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
    clientBuilder.connectTimeout(3 * 1000, TimeUnit.MILLISECONDS);
    clientBuilder.readTimeout(25 * 1000, TimeUnit.MILLISECONDS);

    File cacheDir = new File(mWeakContext.get().getFilesDir().getAbsolutePath(), "http-cache");
    Cache cache = new Cache(cacheDir, 16 * 1024 * 1024); // 16MB
    clientBuilder.cache(cache);

    // set proxy
    Properties properties = System.getProperties();
    if (properties.containsKey("https.proxyHost")) {

        String proxyHost = properties.getProperty("https.proxyHost");
        int proxyPort = Integer.parseInt(properties.getProperty("https.proxyPort"));

        clientBuilder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
                proxyHost,
                proxyPort)
        ));
    }
    clientBuilder.addInterceptor(mHeadersInterceptor);
    clientBuilder.addInterceptor(mSignInterceptor);
    clientBuilder.addInterceptor(mLoggingInterceptor);
    mClient = clientBuilder.build();

Я здесь довольно невежественен, так как этого не происходит много, и я не могу воспроизвести его на своем устройстве.

0 ответов

Другие вопросы по тегам