下面是我正在做的一些快速代码。 (为了使它更具可读性,我将其中的一部分删除了。)本质上,我打开一个文件,并一次处理3k块。这些被编码为Base64(现在是4k块)并通过HTTP post进行上传。在每次调用DataOutputStream.writeBytes()之后,我也调用DataOutputStream.flush(),然后根据已发送的数量更新进度条。Android DataOutputStream刷新方法似乎没有实际刷新
File myImage = new File(somepath);
int bytesAvailable = myImage.length();
while (bytesAvailable > 0)
{
byte[] buffer = new byte[Math.min(12288, (int)bytesAvailable)];
bytesRead = fileInputStream.read(buffer, 0, Math.min(12288, (int)bytesAvailable));
if (bytesRead > 0)
{
s2 = Base64.encodeBytes(buffer);
bytesAvailable = fileInputStream.available();
dataStream.writeBytes(s2);
dataStream.flush();
// UPDATE THE PROGRESS BAR HERE
}
}
现在,当我运行应用程序时,图像每次都成功上传。但是,如果我观察移动连接指示器(向上/向下箭头),则在进度条移动时它们不会亮起。在10秒左右的时间内,条形图将从0到100%,对于3MB图像(3G手机的速度太快)。然后在100%完成此循环后,调用dataStream.close()方法。这是数据传输开始的时间(如箭头所示)。这完成前几分钟。
我不理解flush()是否正确?它不应该强制传输数据吗?
更新 - 搜索一些更多后,我发现[这个链接](http://stackoverflow.com/questions/1852232/dataoutputstream-not-flushing)它说,刷新方法仍然不能保证任何东西, tcp/ip堆栈可能会合并数据包等。我可以改为查询连接或流有多少个字节仍在队列中?这将是另一种处理我的进度条的方式。 – Paul 2011-03-18 12:31:32
是的问题是,你看到的进度不是文件写入服务器的进度,而是文件写入OS缓冲区的进度。苦涩的事实! – 2014-05-01 09:06:58