2015-10-26 2 views
0

У меня есть приложение для Android, в котором я в основном запускаю задачу Async для проверки моего сервера на токен доступа каждые 3 минуты. Но примерно через час приложение зависает, и я вижу это исключение в logcat. Приложение в конечном итоге сбой.Android - java.net.ConnectException: не удалось подключиться - соединение не удалось: EMFILE (Слишком много открытых файлов)

Вот журнал аварии

10-25 16:38:47.527 19845-19845/com.test.app E/SharedPreferencesImpl﹕ Couldn't create directory for SharedPreferences file /data/data/com.test.app/shared_prefs/MY_SHARED_PREF.xml 
10-25 16:38:47.536 19845-19845/com.test.app E/SharedPreferencesImpl﹕ Couldn't create directory for SharedPreferences file /data/data/com.test.app/shared_prefs/MY_SHARED_PREF.xml 
10-25 16:38:47.545 19845-23000/com.test.app W/SpotifySDK﹕ Player::deliverAudio called with 0 frames 
10-25 16:38:47.545 19845-23000/com.test.app I/SpotifySDK﹕ Got notification: Pause 
10-25 16:38:47.547 19845-23000/com.test.app I/SpotifySDK﹕ Got notification: Track ended 
10-25 16:38:47.552 19845-23000/com.test.app I/SpotifySDK﹕ Got notification: Track changed 
10-25 16:38:47.553 19845-19845/com.test.app E/SharedPreferencesImpl﹕ Couldn't create directory for SharedPreferences file /data/data/com.test.app/shared_prefs/MY_SHARED_PREF.xml 
10-25 16:38:47.560 19845-19913/com.test.app W/System.err﹕ java.net.ConnectException: failed to connect to /51.21.21.111 (port 8080) after 10000ms: connect failed: EMFILE (Too many open files) 
10-25 16:38:47.572 19845-19913/com.test.app W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:124) 
10-25 16:38:47.572 19845-19913/com.test.app W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) 
10-25 16:38:47.572 19845-19913/com.test.app W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456) 
10-25 16:38:47.572 19845-19913/com.test.app W/System.err﹕ at java.net.Socket.connect(Socket.java:882) 
10-25 16:38:47.573 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.internal.Platform$Android.connectSocket(Platform.java:190) 
10-25 16:38:47.573 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.Connection.connectSocket(Connection.java:196) 
10-25 16:38:47.573 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.Connection.connect(Connection.java:172) 
10-25 16:38:47.573 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:367) 
10-25 16:38:47.573 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128) 
10-25 16:38:47.573 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328) 
10-25 16:38:47.573 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245) 
10-25 16:38:47.574 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.Call.getResponse(Call.java:267) 
10-25 16:38:47.574 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:224) 
10-25 16:38:47.574 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:195) 
10-25 16:38:47.574 19845-19913/com.test.app W/System.err﹕ at com.squareup.okhttp.Call.execute(Call.java:79) 
10-25 16:38:47.575 19845-19913/com.test.app W/System.err﹕ at com.test.app.async.AccessTokenUpdateTask.doInBackground(AccessTokenUpdateTask.java:57) 
10-25 16:38:47.575 19845-19913/com.test.app W/System.err﹕ at com.test.app.async.AccessTokenUpdateTask.doInBackground(AccessTokenUpdateTask.java:21) 
10-25 16:38:47.575 19845-19913/com.test.app W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292) 
10-25 16:38:47.575 19845-19913/com.test.app W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
10-25 16:38:47.575 19845-19913/com.test.app W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
10-25 16:38:47.575 19845-19913/com.test.app W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
10-25 16:38:47.576 19845-19913/com.test.app W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
10-25 16:38:47.576 19845-19913/com.test.app W/System.err﹕ at java.lang.Thread.run(Thread.java:818) 
10-25 16:38:47.576 19845-19913/com.test.app W/System.err﹕ Caused by: android.system.ErrnoException: connect failed: EMFILE (Too many open files) 
10-25 16:38:47.576 19845-19913/com.test.app W/System.err﹕ at libcore.io.Posix.connect(Native Method) 
10-25 16:38:47.577 19845-19913/com.test.app W/System.err﹕ at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111) 
10-25 16:38:47.577 19845-19913/com.test.app W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:154) 
10-25 16:38:47.577 19845-19913/com.test.app W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122) 
10-25 16:38:47.577 19845-19913/com.test.app W/System.err﹕ ... 22 more 
10-25 16:38:47.578 19845-19845/com.test.app W/art﹕ Large object allocation failed: ashmem_create_region failed for 'large object space allocation': Too many open files 
10-25 16:38:47.603 19845-19845/com.test.app I/art﹕ Alloc sticky concurrent mark sweep GC freed 75611(1974KB) AllocSpace objects, 15(384KB) LOS objects, 13% free, 48MB/55MB, paused 1.317ms total 23.837ms 
10-25 16:38:47.605 19845-19845/com.test.app W/art﹕ Large object allocation failed: ashmem_create_region failed for 'large object space allocation': Too many open files 
10-25 16:38:47.626 19845-19845/com.test.app I/art﹕ Alloc partial concurrent mark sweep GC freed 9352(329KB) AllocSpace objects, 6(1169KB) LOS objects, 25% free, 46MB/62MB, paused 965us total 20.962ms 
10-25 16:38:47.628 19845-19845/com.test.app W/art﹕ Large object allocation failed: ashmem_create_region failed for 'large object space allocation': Too many open files 
10-25 16:38:47.650 19845-19845/com.test.app I/art﹕ Alloc concurrent mark sweep GC freed 399(28KB) AllocSpace objects, 0(0B) LOS objects, 25% free, 46MB/62MB, paused 922us total 21.750ms 
10-25 16:45:19.014 19845-19845/com.test.app E/Surface﹕ dequeueBuffer failed (Unknown error 2147483646) 
10-25 16:45:19.022 19845-19845/com.test.app E/ViewRootImpl﹕ Could not lock surface 
    java.lang.IllegalArgumentException 
      at android.view.Surface.nativeLockCanvas(Native Method) 

.... 

10-25 22:34:42.026 22778-22778/com.test.app E/Parcel﹕ dup() failed in Parcel::read, i is 0, fds[i] is -1, fd_count is 1, error: Too many open files 

Вот мой анализ этого журнала: Я понимаю, почему приложение UI замерла, это было связано с «dequeueBuffer не удалось» и «блокировка поверхности» исключение , Но строка перед ней говорит мне, что приложение хранит слишком много файлов, открытых с каждого 3-минутного пинга, который я делаю на своем сервере.

Я определяю свой клиентский объект в действии, как показано ниже, и передаю в этом объекте клиента эту задачу Async. Я написал другую версию задачи, в которой я определяю объект OkHttpClient в самой задаче Async, но я получаю ту же ошибку. Вот код в моей задаче Async.

Внутри активность

OkHttpClient client = new OkHttpClient(); 

Passing объект клиента к AsyncTask через конструктор

RequestBody body = RequestBody.create("application/json; charset=utf-8", jsonString); 
    Request request = new Request.Builder() 
      .url(url) 
      .post(body) 
      .build(); 
    Response response = null; 
    try { 
     response = client.newCall(request).execute(); 
     if(response.isSuccessful()) { 
      String responseBody = response.body().string(); 
      return responseBody; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Любая идея, как я могу исправить эту ошибку?

ответ

0

Итак, я получил ответ на этот вопрос, и он не имеет ничего общего с OkHTTP. Я делал это из-за другого SDK, который я использовал. Ну, я не использовал это правильно. Это был Spotify Android SDK и в основном, когда я создаю объект игрок Мне нужно создать конфиг для него, как так

Config playerConfig = new Config(this, 
      accessToken, 
      getString(R.string.client_id)); 

Все, что я должен был сделать, это добавить следующую строку

playerConfig.useCache(false); 
1

Вы создаете новый OkHttpClient каждый раз, когда выполняется задача async. Квадрат documentation указывает, что большинство приложений используют один экземпляр okhttpclient. Попробуйте переместить экземпляр okhttpclient из задачи async, чтобы на один жизненный цикл приложения был создан только один экземпляр.

+0

Итак, после публикации этого вопроса я прочитал документацию и сделал это точно. Но я все равно получаю ту же ошибку. Сейчас я редактирую вопрос, чтобы отразить это. – anonymous123

+0

Хм нормально. Посмотрев на трассировку стека, я вижу, что вы используете Spotify. Нижняя часть стека выглядит как изъятые из памяти исключения. Использует ли Spotify собственный код в своем SDK? Все ли ваши музыкальные потоки закрыты внутри блоков? – davehenry

+0

Это хороший вопрос. Я не знаю об этом, поскольку Spotify не открыла для нас код, чтобы понять это. Надо спросить их об этом. Но так как OkHttp выбрасывает это исключение, разве вы не думаете, что это связано с ними? А также, поскольку Spotify имеет свой собственный объект Player, а Square имеет свой собственный объект OkHttp, объект Player не может вмешиваться в объект OkHttp в отношении файлов, открытых соответствующими объектами. – anonymous123

Смежные вопросы