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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...