2011-03-17 52 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