2011-03-17 55 views
0

下面是我正在做的一些快速代码。 (为了使它更具可读性,我将其中的一部分删除了。)本质上,我打开一个文件,并一次处理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()是否正确?它不应该强制传输数据吗?

+0

更新 - 搜索一些更多后,我发现[这个链接](http://stackoverflow.com/questions/1852232/dataoutputstream-not-flushing)它说,刷新方法仍然不能保证任何东西, tcp/ip堆栈可能会合并数据包等。我可以改为查询连接或流有多少个字节仍在队列中?这将是另一种处理我的进度条的方式。 – Paul 2011-03-18 12:31:32

+0

是的问题是,你看到的进度不是文件写入服务器的进度,而是文件写入OS缓冲区的进度。苦涩的事实! – 2014-05-01 09:06:58

回答

2

这听起来像是你将4k块添加到数据流中,然后将http数据流发送到服务器。如果是这种情况,那么你的循环基本上遍历一个内存拷贝,并且在你完成数据流之后将发生http传输。了解上传过程的唯一途径就是掌握套接字及其数据流。如果使用DefaultHttpClientConnection等,这看起来相当困难。

+0

我只是猜测这是不可能的。我很久以前就放弃了它。如果有人在这篇文章中绊倒并且知道某种方式,请告诉我! – Paul 2011-06-06 12:38:37