上传文件丢失OutOfMemoryError
我想上传一个文件到网络服务器使用的代码。但是当大小> 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);
这条线会抛出错误。
根据块的基础将文件上传到服务器块。例。首先从服务器获取响应后上传1024字节的数据,然后上传1024字节的数据,直到文件的所有数据上传。
我解决这个问题是这样的:在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
你可以举例/ – 2014-05-21 07:54:00
如果您在仿真器上测试此代码,请确保您的RAM大小接近实际设备值。
我测试它在HTC G7 – ray 2011-12-26 11:40:01
然后尝试上传文件块的块,因为Sunil库马尔Sahoo说 – 2011-12-26 11:42:44
你可以发布Logcat消息吗?哪一行是你得到的例外。 – Karthik 2011-12-26 11:22:33
Hi ray。你能否在这里添加你的答案并进行详细说明。我非常震惊。 – 2012-01-20 07:49:55