我正在尝试上传从相机中取回的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