簡體   English   中英

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$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分鍾的ping操作后,該應用程序都會打開太多文件。

我在如下所示的活動中定義我的客戶端對象,並將該客戶端對象傳遞給該Async任務。 我編寫了該任務的另一個版本,其中在Async任務本身中定義了OkHttpClient對象,但遇到了相同的錯誤。 這是我的異步任務中的代碼。

活動內部

    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。 方形文檔指示大多數應用程序使用一個okhttpclient實例。 嘗試將okhttpclient實例移出異步任務,以便每個應用程序生命周期僅創建一個實例。

所以我得到了這個問題的答案,它與OkHTTP無關。 我由於使用了另一個SDK而發生了事情。 好吧,我沒有正確地使用它。 那是Spotify Android SDK,基本上,當我創建播放器對象時,我需要為其創建配置,如下所示

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

我所要做的就是添加以下行

playerConfig.useCache(false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM