2011-12-26 64 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(); 

我能做什麼來解決這個問題? 感謝

有logcat的相關信息:

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 2011-12-26 11:22:33

+0

Hi ray。你能否在這裏添加你的答案並進行詳細說明。我非常震驚。 – 2012-01-20 07:49:55

回答

3

根據塊的基礎將文件上傳到服務器塊。例。首先從服務器獲取響應後上傳1024字節的數據,然後上傳1024字節的數據,直到文件的所有數據上傳。

+0

我解決這個問題是這樣的:在while循環,如果添加(總計TOTALSIZE> 5 * 1024 * 1024)爆發,做( \t \t os.flush(); \t \t os.close(); conn.disconnect() ; \t \t System.gc();)不要關閉文件inputstream。如果未完成重做上傳功能。 – ray 2011-12-27 02:56:54

+0

你可以舉例/ – 2014-05-21 07:54:00

1

如果您在仿真器上測試此代碼,請確保您的RAM大小接近實際設備值。

+0

我測試它在HTC G7 – ray 2011-12-26 11:40:01

+0

然後嘗試上傳文件塊的塊,因爲Sunil庫馬爾Sahoo說 – 2011-12-26 11:42:44