我正在尝试上传图像,但如果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发布于 2010-07-28 02:00:49
构造不带长度的InputStreamRequestEntity会导致它在本地缓冲数据,因此它可以确定长度。由于您将其作为文件存储,因此请改用FileRequestEntity,因为它将根据文件确定大小。
发布于 2010-07-28 01:51:22
InputStreamRequestEntity类表明您仍在使用旧的HttpClient 3.x。
所以你有3个选择:
请求输出流,以避免通过直接流到服务器的套接字来缓冲任何内容正文。
虽然不确定是否可以在Android上升级,因为它似乎是内置的。
Request streaming:流式请求be遇到的主要困难是,由于鉴权失败或I/O失败,需要重试某些实体封装方法。显然,非缓冲实体不能被重新读取和重新提交。推荐的方法是创建一个能够重构底层输入流的自定义RequestEntity。
(代码片段,示例)
java.net.URLConnection,将其转换为HttpURLConnection,并设置流模式。例如。((HttpURLConnection)连接).setChunkedStreamingMode(1024);
它将以1KB的区块形式发送请求正文。More hints here.
https://stackoverflow.com/questions/3345476
复制相似问题