在Jelly Bean(Android 4.1)中发生了错误->打开失败:EMFILE(打开的文件太多)



我正在开发一个下载应用程序并同时运行多个线程以快速下载。但是我遇到了一个问题 android 4.1 果冻豆 它会产生打开的文件太多(打开失败:EMFILE(打开的文件太多))的异常。据我所知,可能只有一个1024文件应该为一个进程打开。但是问题只发生在果冻豆上,而不是ICS上。

有没有人可以帮助解决这些问题。由于很多文件,下载超过 10 个线程的文件很重要。

请提出任何想法。以语法方式解决程序。

Linux 操作系统上每个进程打开的文件数有硬性限制。 如果您具有系统级访问权限,则该数字是可配置的,但不能通过 Android 进行配置。 除了编写应用程序之外,无需执行任何操作,以便一次打开的文件更少。

尽管实际上,如果您遇到此问题,则可能会在某处泄漏文件句柄。 确保关闭所有打开的文件 - 限制是同时打开的文件,如果您关闭一个文件,您可以随时打开一个新文件来取代它。

几周

前我才在Jellybean中遇到了同样的问题,终于找到了解决方法。见 https://stackoverflow.com/a/20417556/976367

也许httpClient"有更多的错误"并且被弃用了,但是JellyBean的这个问题是一个阻碍。我正在使用 Ksoap2,所以我尝试了所有建议的答案。

  • System.setProperty("http.keepAlive", "false");
  • httpTransportSE.getServiceConnection().setRequestProperty("Connection", "close");
  • httpTransportSE.getServiceConnection().disconnect();

没有任何效果 - 我的解决方案是将我正在使用的 Ksoap2 版本从 3.1.1 回滚到 2.6.5。使用 2.6.5 可以大大减少问题。仍在测试,但甚至可能解决了。

版本的KSoap2对我有用的原因可能是它使用的是httpClient而不是httpUrlConnection。

最新更新