我正在尝试上传图片,但如果Android设备上的图片文件超过2兆,我会收到一些内存不足错误。
File file = new File(<my image file>);
FileInputStream fis = new FileInputStream(file);
HttpClient client = new HttpClient();
PutMethod method = new PutMethod(myUrl);
RequestEntity requestEntity = new InputStreamRequestEntity(fis);
method.setRequestEntity(requestEntity);
client.executeMethod(method);
executeMethod行发生内存不足错误。如何更改此选项以读取流,而不是将整个流读入内存并导致崩溃?
hte DDMS输出示例:
07-27 10:46:24.334: DEBUG/dalvikvm(26576): GC freed 6787 objects / 522592 bytes in 119ms
07-27 10:46:24.374: DEBUG/dalvikvm(26576): GC freed 1738 objects / 196752 bytes in 33ms
07-27 10:46:24.374: INFO/dalvikvm-heap(26576): Grow heap (frag case) to 5.184MB for 253968-byte allocation
07-27 10:46:24.414: DEBUG/dalvikvm(26576): GC freed 0 objects / 0 bytes in 45ms
07-27 10:46:24.464: DEBUG/dalvikvm(26576): GC freed 3 objects / 122992 bytes in 48ms
07-27 10:46:24.474: INFO/dalvikvm-heap(26576): Grow heap (frag case) to 5.558MB for 516112-byte allocation
07-27 10:46:24.524: DEBUG/dalvikvm(26576): GC freed 0 objects / 0 bytes in 57ms
07-27 10:46:24.574: DEBUG/dalvikvm(26576): GC freed 3 objects / 254056 bytes in 46ms
07-27 10:46:24.754: INFO/dalvikvm-heap(26576): Grow heap (frag case) to 6.308MB for 1040400-byte allocation
07-27 10:46:24.824: DEBUG/dalvikvm(26576): GC freed 3 objects / 516168 bytes in 63ms
07-27 10:46:24.894: INFO/dalvikvm-heap(26576): Grow heap (frag case) to 7.808MB for 2088976-byte allocation
07-27 10:46:24.994: DEBUG/dalvikvm(26576): GC freed 0 objects / 0 bytes in 101ms
07-27 10:46:25.034: DEBUG/dalvikvm(26576): GC freed 3 objects / 1040456 bytes in 34ms
07-27 10:46:25.084: INFO/dalvikvm-heap(26576): Grow heap (frag case) to 10.808MB for 4186128-byte allocation
07-27 10:46:25.154: DEBUG/dalvikvm(26576): GC freed 0 objects / 0 bytes in 63ms
07-27 10:46:25.434: DEBUG/dalvikvm(26576): GC freed 3 objects / 2089032 bytes in 58ms
07-27 10:46:25.714: INFO/dalvikvm-heap(26576): Grow heap (frag case) to 16.808MB for 8380432-byte allocation
07-27 10:46:25.784: DEBUG/dalvikvm(26576): GC freed 0 objects / 0 bytes in 70ms
07-27 10:46:26.204: DEBUG/dalvikvm(26576): GC freed 3 objects / 4186184 bytes in 65ms
07-27 10:46:26.204: INFO/dalvikvm-heap(26576): Forcing collection of SoftReferences for 16769040-byte allocation
答案 0 :(得分:4)
构造InputStreamRequestEntity
没有长度会导致它在本地缓冲数据,因此它可以确定长度。由于您将其作为文件使用,因此请使用FileRequestEntity
,因为它将确定文件的大小。
答案 1 :(得分:2)
InputStreamRequestEntity
班级表示您仍在使用旧的HttpClient 3.x。
所以你有3个选择:
升级到HttpClient 4.0,宣传自己:
请求输出流,以避免通过直接流式传输到服务器的套接字来缓冲任何内容体。
不确定是否可以在Android上进行升级,因为它似乎是内置的。
按照HttpClient 3.x performance guide中的请求实体流建议进行操作。
请求流式传输:流式请求主体遇到的主要困难是由于身份验证失败或I / O故障需要重试某些封装方法的实体。显然,无法重新读取和重新提交非缓冲的实体。建议的方法是创建一个能够重建基础输入流的自定义RequestEntity。
(剪辑,代码示例)
抓住“普通香草”java.net.URLConnection
,将其投放到HttpURLConnection
并设置流媒体模式。 E.g。
((HttpURLConnection) connection).setChunkedStreamingMode(1024);
将以1KB的块发送请求正文。 More hints here