这是我正在做的一些快速代码。 (我删除了一些以使其更具可读性。)基本上,我打开一个文件,一次处理3k块。这些编码到Base64(现在4k块)并通过HTTP post上传。每次调用DataOutputStream.writeBytes()后,我也调用DataOutputStream.flush(),然后根据已发送的内容更新进度条。
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()吗?它不应该强制传输数据吗?
答案 0 :(得分:2)
在我看来,你正在将4k块添加到数据流中,然后将这些数据流以http帖子的形式发送到服务器。如果是这种情况,那么您的循环基本上是在内存副本上进行迭代,并且在您完成数据流之后将发生http传输。确定上传方式的唯一方法是获取套接字及其数据流。如果您使用DefaultHttpClientConnection等,这看起来很难。