微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – HttpURLConnection:setFixedLengthStreamingMode()想要的大小是多少?

我正在尝试上传从相机中取回的jpeg图像缓冲区.我知道长度,但是如果我将这个长度传递给setFixedLengthStreamingMode()例程,我会在logcat中得到错误,告诉我它预计会有不同的大小.我不知道这是一个 android bug(我在这个设备上运行2.3.3),或者我应该添加除了POST数据之外的标题大小或者什么.我可以使用setChunkedStreamingMode(0)并且工作正常,但我认为避免复制数据的开销会很好.我似乎总是关闭155字节,除非我随意添加155字节,然后它告诉我我2字节关闭:-).

解决方法

URLConnection认缓存在客户端内存中写入其getoutputStream()的所有内容,直到它关闭为止.这是必需的,因为需要设置HTTP Content-Length响应头.但只有在写入所有字节后才能知道内容长度.当响应体相对较大时,这可能是记忆占用.

如果您事先知道正在写入的确切字节数(注意:字节,而不是字符),那么您可以使用setFixedLengthStreamingMode()来设置恰好该字节数,以便可以更快地设置Content-Length标头.这样URLConnection可以更频繁地刷新.在您的特定情况下,您显然使用了错误的值.

setChunkedStreamingMode()基本上将传输编码更改为chunked.这基本上是一行,其中字节长度为十六进制代码,然后是一行写入的字节,然后是空行(另请参阅wikipedia).最后一行的字节长度为0,因此服务器知道它何时是正文的结尾,因此它不必等待任何传入的数据.这允许更频繁地刷新响应主体.您不应该将其设置为0,而应使用合理的值,例如1000左右.这样,每1000个写入的字节将作为新块发送.

也可以看看:

> Using java.net.URLConnection to fire and handle HTTP requests

原文地址:https://www.jb51.cc/android/310210.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐