title: Android - java.net.ConnectException: failed to connect - connect failed: EMFILE (Too many open files)
body: <p>I have an Android app where I am basically running an Async task to ping my server for an Access Token every 3 minutes. But after about an hour the app freezes and I see this exception in logcat. The app eventually crashes.</p>
  
  <p>Here is the log of the crash</p>
  
  <pre><code>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
  </code></pre>
  
  <p>Here is my analysis of this log: I understand why the app UI froze, it was due to the "dequeueBuffer failed" and the "lock surface" exception. But the line before it tells me that the app is keeping too many files open from each 3 min ping I make to my server. </p>
  
  <p>I am defining my client object in the activity like below and am passing in that client object to that Async task. I wrote another version of the task where I am defining the OkHttpClient object in the Async task itself but I am getting the same error. Here is the code in my Async task.</p>
  
  <p>Inside the Activity</p>
  
  <pre><code>    OkHttpClient client = new OkHttpClient();
  </code></pre>
  
  <p>Passing the client object to the AsyncTask via the constructor</p>
  
  <pre><code>    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();
      }
  </code></pre>
  
  <p>Any idea how I can fix this error? </p>