0

这是我正在做的一些快速代码。(我删除了其中的一些以使其更具可读性。)本质上,我正在打开一个文件,一次处理 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
   }
}

现在,当我运行应用程序时,每次都成功上传图像。但是,如果我查看移动连接指示器(向上/向下箭头),它们不会在进度条移动时亮起。对于 3MB 图像(对于我的 3G 手机来说太快了),该条将在 10 秒左右的时间内从 0 变为 100%。然后在 100% 完成此循环后,调用 dataStream.close() 方法。这是数据传输开始的时间(如箭头所示)。这会在完成前等待几分钟。

我不正确理解 flush() 吗?它不应该强制传输数据吗?

4

1 回答 1

2

在我看来,您将 4k 块添加到数据流中,然后将该数据流在 http post 中发送到服务器。如果是这种情况,那么您的循环本质上是在内存副本上进行迭代,并且在您完成数据流之后会发生 http 传输。确定上传进度的唯一方法是掌握套接字及其数据流。如果您使用 DefaultHttpClientConnection 等,这看起来很困难。

于 2011-06-06T00:32:22.310 回答