2012-11-14 2 views
1

다운로드 응용 프로그램을 만들고 동시에 여러 스레드를 실행하여 빠르게 다운로드하고 있습니다. 하지만 안드로이드 4.1 젤리 빈 문제가 발생했습니다 너무 많은 파일의 예외를 생산 오픈 (오픈 실패 : EMFILE (너무 많은 열린 파일)). 내가 아는 한 1024 개의 파일이 하나의 프로세스에만 열려 있어야합니다. 그러나 문제는 ICS가 아닌 젤리 빈에서만 발생합니다.In Jelly Bean (Android 4.1)에서 오류가 발생했습니다. -> open failed : EMFILE (열려있는 파일이 너무 많습니다.)

이 문제를 해결하는 데 도움을 줄 수있는 사람이 있습니까? 로트의 파일 때문에 10 개 이상의 스레드에서 파일을 다운로드하는 것이 중요합니다.

아이디어를 제안하십시오. 프로를 문법적으로 해결합니다.

+0

http://illegalargumentexception.blogspot.de/2008/10/java-how-not-to-make-mess-mess-of-stream.html은 'OutputStream'을 닫는 신뢰할 수있는 방법에 대한 좋은 자료입니다. 귀하의 문제는 아마 어떻게 든 닫지 않는 것들과 관련이 있습니다 – zapl

+0

해결책을 찾을 수 있었습니까? 나는 Jellybean과 같은 문제를 겪고있다. 사실 모든 버전의 Jellybean (4.1에서 4.3). Gingerbread, ICS 및 Kitkat에는 문제가 없습니다. –

답변

1

리눅스 OS에서 프로세스 당 열린 파일의 수에는 엄격한 제한이 있습니다. 이 번호는 시스템 레벨 액세스 권한이 있지만 Android를 통해 액세스 할 수없는 경우 구성 할 수 있습니다. 응용 프로그램을 작성하는 것 외에는 할 일이 없으므로 한 번에 열리는 파일 수가 적습니다.

현실적으로는이 문제를 겪고 있다면 어딘가에 파일 핸들이 누출 될 수 있습니다. 열려있는 모든 파일을 닫아야합니다. 한도는 동시에 파일을 열 때 제한됩니다. 한 파일을 닫을 경우 항상 새로운 파일을 열어 제한을 제거 할 수 있습니다.

1

httpClient에 "더 많은 버그가있다"가 있지만 더 이상 사용되지 않을 수 있습니다.하지만 JellyBean의 문제는 showstopper입니다. 나는 KSOAP2를 사용하고 있으므로 가능한 모든 대답을 시도했습니다.

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

아무 것도 작동하지 않았습니다. 제 해결책은 3.1.1에서 2.6.5까지 사용하는 Ksoap2 버전을 롤백하는 것이 었습니다. 2.6.5를 사용하면 문제가 상당히 줄어 듭니다. 아직 테스트 중이지만 해결할 수도 있습니다.

이전 버전의 KSoap2가 작동하는 이유는 httpUrlConnection이 아닌 httpClient를 사용하기 때문일 수 있습니다.

관련 문제