Android - java.net.ConnectException:连接失败 - 连接失败:EMFILE(打开的文件太多)
Android - java.net.ConnectException: failed to connect - connect failed: EMFILE (Too many open files)
我有一个 Android 应用程序,我基本上是 运行 一个异步任务,每 3 分钟 ping 我的服务器以获取访问令牌。但是大约一个小时后,应用程序冻结了,我在 logcat 中看到了这个异常。该应用最终崩溃了。
这是崩溃的日志
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.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.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.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 failed" 和 "lock surface" 异常。但它之前的一行告诉我,应用程序在我对服务器进行的每 3 分钟 ping 中保持打开太多文件。
我在 activity 中定义我的客户端对象,如下所示,并将该客户端对象传递给该异步任务。我写了另一个版本的任务,我在异步任务本身中定义了 OkHttpClient 对象,但我遇到了同样的错误。这是我的异步任务中的代码。
里面Activity
OkHttpClient client = new OkHttpClient();
通过构造函数将客户端对象传递给 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();
}
知道如何修复此错误吗?
每次执行异步任务时,您都在创建一个新的 OkHttpClient。方块 documentation 表示大多数应用程序使用一个 okhttpclient 实例。尝试将您的 okhttpclient 实例移出异步任务,以便每个应用程序生命周期只创建一个实例。
所以我得到了这个问题的答案,它与OkHTTP无关。由于我正在使用另一个 SDK,我正在发生这种情况。好吧,我没有正确使用它。它是 Spotify Android SDK,基本上当我创建播放器对象时,我需要像这样为它创建一个配置
Config playerConfig = new Config(this,
accessToken,
getString(R.string.client_id));
我所要做的就是添加以下行
playerConfig.useCache(false);
我有一个 Android 应用程序,我基本上是 运行 一个异步任务,每 3 分钟 ping 我的服务器以获取访问令牌。但是大约一个小时后,应用程序冻结了,我在 logcat 中看到了这个异常。该应用最终崩溃了。
这是崩溃的日志
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.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.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.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 failed" 和 "lock surface" 异常。但它之前的一行告诉我,应用程序在我对服务器进行的每 3 分钟 ping 中保持打开太多文件。
我在 activity 中定义我的客户端对象,如下所示,并将该客户端对象传递给该异步任务。我写了另一个版本的任务,我在异步任务本身中定义了 OkHttpClient 对象,但我遇到了同样的错误。这是我的异步任务中的代码。
里面Activity
OkHttpClient client = new OkHttpClient();
通过构造函数将客户端对象传递给 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();
}
知道如何修复此错误吗?
每次执行异步任务时,您都在创建一个新的 OkHttpClient。方块 documentation 表示大多数应用程序使用一个 okhttpclient 实例。尝试将您的 okhttpclient 实例移出异步任务,以便每个应用程序生命周期只创建一个实例。
所以我得到了这个问题的答案,它与OkHTTP无关。由于我正在使用另一个 SDK,我正在发生这种情况。好吧,我没有正确使用它。它是 Spotify Android SDK,基本上当我创建播放器对象时,我需要像这样为它创建一个配置
Config playerConfig = new Config(this,
accessToken,
getString(R.string.client_id));
我所要做的就是添加以下行
playerConfig.useCache(false);