android - HttpURL连接 : what does setFixedLengthStreamingMode() want the size of?

标签 android http image-uploading

我正在尝试上传从相机返回的 jpeg 图像缓冲区。我知道长度,但如果我只将该长度传递给 setFixedLengthStreamingMode() 例程,我会在 logcat 中收到错误,告诉我它需要不同的大小。我不知道这是否是一个 android 错误(我在此设备上运行 2.3.3),或者我应该在 POST 数据之外添加 header 的大小或什么。我可以使用 setChunkedStreamingMode(0) 并且效果很好,但我认为避免复制数据的开销会很好。我似乎总是少了 155 个字节,除非我任意添加 155 个字节,然后它告诉我少了 2 个字节:-)。

最佳答案

默认情况下,URLConnection 缓冲一切 写入客户端内存中的 getOutputStream(),直到它关闭。这是强制性的,因为需要设置 HTTP Content-Length 响应 header 。但是内容长度只有在所有字节都被写入后才知道。当响应主体相对较大时,这可能会占用内存。

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

setChunkedStreamingMode() 基本上将传输编码更改为chunked。这基本上是一行以十六进制代码表示的字节长度,然后是一行写入的字节,然后是一个空行(另请参见 wikipedia )。最后一行的字节长度为 0,因此服务器知道它何时是主体的末尾,因此它不必等待任何传入数据。这允许更频繁地刷新响应主体。你不应该只将它设置为 0,而应该设置一个合理的值,比如 1000 左右。这样每 1000 个写入的字节将作为一个新 block 发送。

另见:

关于android - HttpURL连接 : what does setFixedLengthStreamingMode() want the size of?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105592/

相关文章:

android - CI TeamCity for android 无法为具有库和默认 build.xml 的项目构建 .apk 文件

java - 上传 Minecraft 皮肤

java - 是否可以从 Spring Integration http inbound-channel-adapter 返回 204?

java - Struts 2 - 拦截使用CKEditor上传的图像文件

java - "The type org.springframework.web.WebApplicationInitializer cannot be resolved. It is indirectly referenced from required .class files"

wordpress - 无法在 Wordpress 的 wp-content/uploads 中创建目录

android - 即使应用程序在 android 中被杀死,处理程序实例如何运行可运行的?

java - 应用程序关闭后仍保持 Activity 状态且不会锁定 UI 的服务

java - 如何在评估子项目之前执行 Gradle 任务

java - 用java解析http返回的xml