2

OutOfMemoryError在 Android 中发布大文件时,我有时会遇到问题。这是我正在使用的代码。难道我做错了什么?

HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
ostream = new DataOutputStream(con.getOutputStream());
byte[] buffer = new byte[1536];
int count;
while ((count = fileInput.read(buffer)) != -1) {
    ostream.write(buffer, 0, count); // This sometimes causes OutOfMemoryError
}
ostream.flush();

ostream.flush()在循环内调用while会有用吗?

4

2 回答 2

4

如果你这样做,整个 POST 必须缓冲在内存中。这是因为它需要先发送 Content-Length 标头。

相反,我认为您想使用 Apache HTTP 库,包括FileEntity。这将让它在读取文件之前计算出长度。您可以将此答案作为起点。但 FileEntity 构造函数的第二个参数应该是 mime 类型(如 image/png、text/html 等)。

于 2010-12-15T21:28:15.950 回答
2

HTTP 连接很好,但是 HTTPS 会触发 Out of Memory 错误,因为 Android 2.3.4 中的 HttpsURLConnectionImpl.java 中有一个错误(在我的平板电脑上验证),并且在 Android 4.1 中已修复(我已经检查了源代码)。

顺便说一句,他应该通过添加“con.setChunkedStreamingMode(0);”来避免在 RAM 中缓冲整个 POST 数据。紧接在“con.setDoOutput(true);”之后 陈述。

于 2012-08-10T14:12:35.103 回答