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

时间:2012-11-14 18:16:33

标签: java android linux

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

有没有人可以帮忙解决这些问题。因为批次的文件,在10个以上的线程中下载文件非常重要。

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

3 个答案:

答案 0 :(得分:1)

Linux操作系统上每个进程的打开文件数量存在硬性限制。如果您具有系统级访问权限,则该数字是可配置的,但不能通过Android进行配置。除了编写应用程序以外,没有什么可做的,因此可以同时打开更少的文件。

虽然实际上,如果你遇到这个问题,你可能会在某个地方泄漏文件句柄。确保关闭所有打开的文件 - 限制是同时打开文件,如果你关闭一个文件,你总是可以打开一个新的文件取而代之。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

  • System.setProperty(“http.keepAlive”,“false”);
  • httpTransportSE.getServiceConnection()。setRequestProperty(“Connection”,“close”);
  • httpTransportSE.getServiceConnection()断开();

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

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