2012-10-30 48 views
5

我有一個Android應用程序,它使用計時器每5-10秒調用一次AsyncTask(使用java.util.Timer和java。 util.TimerTask)。 AsyncTask從Amazon AWS S3數據庫獲取圖像數據,併爲主UI活動加載ImageView。Android錯誤:「無法創建epoll實例」或「無法創建喚醒管道」

這工作正常一兩個小時,但然後我得到一個神祕的錯誤消息,應用程序被殺害。該錯誤消息來自「尺蠖」,並說可以:

Could not create epoll instance. errno=24 

Could not create wake pipe 

在網絡上搜索,似乎表明該問題可能是與文件描述符(打開太多的文件描述符?)。我已經瀏覽了代碼,但沒有看到文件,流或連接沒有關閉的地方。

當應用程序被殺死了,logcat中具有AndroidRuntime,說一個消息:

FATAL EXCEPTION: main 

有誰有關於這些消息,或如何解決線索?謝謝!

+0

發表一些代碼。 – Wug

+0

有很多代碼,我不確定哪些部分可能會導致錯誤。我主要是在尋找任何可能導致這樣的錯誤信息的線索。謝謝。 – gcl1

+0

我懷疑互聯網是正確的關於文件描述符,張貼定時器調用的部分。 – Wug

回答

0

其他信息:以下代碼全部在Fragment中。

這裏是啓動定時器的代碼:

slideTimer = new Timer(); 
    slideTimer.schedule(new TimerTask() {   
     @Override 
     public void run() { 
      timerMethod(); 
     } 
    }, 0, 5000); 

這裏是由定時器調用的方法:

private void timerMethod() 
{ 
    Activity activity = getActivity(); 

    if (activity != null) 
     activity.runOnUiThread(timerTick); 
} 

這裏是在完成工作(通過的AsyncTask加載imageView從遠程存儲的文件名):

final Runnable timerTick = new Runnable() { 
    public void run() { 

    MyAsyncTask task = new MyAsyncTask(imageView); 
    task.execute(fileName); 
}; 
-1

我在我的代碼中得到了同樣的錯誤,當我使用警報會過快地觸發任務。

我修改了它的方法是改變我的代碼,使它只添加到警報中,在方法的平均運行時間之後再次運行(加上一些額外的時間以防萬一)。如果您比完成執行更快地添加任務,那麼您將最終填寫最終引發錯誤的Looper。

基本上,Looper所有的東西都是由我理解的線程運行的東西隊列。

0

可能的內存泄漏。使用Leakcanary來檢測代碼的哪一部分正在創建。