使用InputStreams = Out Of Memory错误上传图像

时间:2010-07-27 15:54:47

标签: java android

我正在尝试上传图片,但如果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

2 个答案:

答案 0 :(得分:4)

构造InputStreamRequestEntity没有长度会导致它在本地缓冲数据,因此它可以确定长度。由于您将其作为文件使用,因此请使用FileRequestEntity,因为它将确定文件的大小。

答案 1 :(得分:2)

InputStreamRequestEntity班级表示您仍在使用旧的HttpClient 3.x

所以你有3个选择:

  1. 升级到HttpClient 4.0,宣传自己:

      

    请求输出流,以避免通过直接流式传输到服务器的套接字来缓冲任何内容体。

    不确定是否可以在Android上进行升级,因为它似乎是内置的。

  2. 按照HttpClient 3.x performance guide中的请求实体流建议进行操作。

      

    请求流式传输:流式请求主体遇到的主要困难是由于身份验证失败或I / O故障需要重试某些封装方法的实体。显然,无法重新读取和重新提交非缓冲的实体。建议的方法是创建一个能够重建基础输入流的自定义RequestEntity

         

    (剪辑,代码示例)

  3. 抓住“普通香草”java.net.URLConnection,将其投放到HttpURLConnection并设置流媒体模式。 E.g。

    ((HttpURLConnection) connection).setChunkedStreamingMode(1024);
    

    将以1KB的块发送请求正文。 More hints here

相关问题