下面是我正在做的一些快速代碼。 (爲了使它更具可讀性,我將其中的一部分刪除了。)本質上,我打開一個文件,並一次處理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