2011-12-26 4 views
1

업로드하려면 그물 서버에 파일을 코드를 사용합니다. 하지만 크기> 6M가, 치명적인 예외 java.lang.OutOfMemoryError업로드 파일을 던져 OutOfMemoryError

HttpURLConnection conn; 
    URL url = new URL(mServerUrl); 
    conn = (HttpURLConnection) url.openConnection(); 
    conn.setDoOutput(true); 
    conn.setDoInput(true); 
    conn.setUseCaches(false); 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Content-Type", file.getContentType()); 
    conn.setRequestProperty("Connection", "close"); 
    conn.setRequestProperty("Charset", "UTF-8"); 
    conn.connect(); 
    DataOutputStream os = new DataOutputStream(conn.getOutputStream()); 

    int totalSize = 0; 
    byte[] buffer = new byte[1024]; 
    int len = 0; 
    while ((len = file.getInStream().read(buffer, 0, 1024)) != -1) { 

     totalSize += len; 
     WDLog.i("totalSize = " + totalSize); 
     os.write(buffer, 0, len); 

    } 

    file.getInStream().close(); 
    os.flush(); 
    os.close(); 

를 던질 때이 문제를 해결하기 위해 무엇을 할 수? 감사

로그 캣 정보를 정기적있다 :

12-26 19:35:06.976: D/dalvikvm(8952): GC_FOR_MALLOC freed 36718 objects/1675552 bytes in 53ms 
12-26 19:35:06.976: I/dalvikvm-heap(8952): Forcing collection of SoftReferences for 12580880-byte allocation 
12-26 19:35:07.006: D/dalvikvm(8952): GC_FOR_MALLOC freed 646 objects/47808 bytes in 34ms 
12-26 19:35:07.006: E/dalvikvm-heap(8952): Out of memory on a 12580880-byte allocation. 
12-26 19:35:07.006: I/dalvikvm(8952): "Thread-29" prio=5 tid=8 RUNNABLE 
12-26 19:35:07.006: I/dalvikvm(8952): | group="main" sCount=0 dsCount=0 s=N obj=0x46230978 self=0x30eb98 
12-26 19:35:07.006: I/dalvikvm(8952): | sysTid=8980 nice=0 sched=0/0 cgrp=default handle=3159096 
12-26 19:35:07.016: I/dalvikvm(8952): | schedstat=(5075164776 7730011023 9520) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:~93) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218) 
12-26 19:35:07.016: I/dalvikvm(8952): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$DefaultHttpOutputStream.write(HttpURLConnectionImpl.java:750) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.io.DataOutputStream.write(DataOutputStream.java:101) 
12-26 19:35:07.016: I/dalvikvm(8952): at com.amtcmv.upload.UploadImgVidFile.postVid(UploadImgVidFile.java:218) 
12-26 19:35:07.016: I/dalvikvm(8952): at com.amtcmv.upload.UploadImgVidFile.run(UploadImgVidFile.java:95) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.lang.Thread.run(Thread.java:1102) 
12-26 19:35:07.016: E/dalvikvm(8952): Out of memory: Heap Size=19783KB, Allocated=9352KB, Bitmap Size=162KB 
12-26 19:35:07.016: W/dalvikvm(8952): threadid=8: thread exiting with uncaught exception (group=0x400259f8) 
12-26 19:35:07.026: E/AndroidRuntime(8952): FATAL EXCEPTION: Thread-29 
12-26 19:35:07.026: E/AndroidRuntime(8952): java.lang.OutOfMemoryError 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$DefaultHttpOutputStream.write(HttpURLConnectionImpl.java:750) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.io.DataOutputStream.write(DataOutputStream.java:101) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at com.amtcmv.upload.UploadImgVidFile.postVid(UploadImgVidFile.java:218) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at com.amtcmv.upload.UploadImgVidFile.run(UploadImgVidFile.java:95) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.lang.Thread.run(Thread.java:1102) 

os.write (버퍼, 0, LEN)으로는;

이 줄은 오류를 발생시킵니다.

+0

Logcat 메시지를 게시 할 수 있습니까? 어느 선에서 예외를 얻고 있습니까? – Karthik

+0

안녕하세요. 여기에 답을 추가하고 자세히 설명해 주시겠습니까? 나는 정말로 여기에서 맞았다. –

답변

3

파일을 청크로 서버에 업로드합니다 (청크는 기준). 예. 먼저 파일의 모든 데이터가 업로드 될 때까지 1024 바이트의 데이터를 서버에서 업로드 한 후 다음 1024 바이트의 데이터를 업로드하는 등의 작업을 수행합니다.

+0

는이 같은 문제를 해결 : (totalSize는> 5 * 1024 * 1024) 탈옥 ( \t \t os.flush() 할 경우 동안 사이클에 추가; \t \t os.close를(); conn.disconnect() ; \t \t System.gc();) 파일 입력 스트림을 닫지 마십시오. 그리고 미완료 재실행 업로드 기능. – ray

+0

내가 줄 수있는 예/ –

1

에뮬레이터에서이 코드를 테스트하는 경우 RAM 크기가 실제 장치 값에 가깝게 설정되어 있는지 확인하십시오.

+0

나는 htc g7 – ray

+0

에서 테스트 한 다음 Sunlight Kumar Sahoo가 말한 것처럼 청크로 파일 청크를 업로드 해 봅니다. –