我有什麼感覺應該是一個解決的問題。我正在寫的Android應用程序發送的消息非常類似於用戶可以附加文件的SMS。我使用HttpUrlConnection發送這個數據到我的服務器,基本上歸結爲一個java.io.OutputStream(我把它包裝在一個DataOutputStream中)。真的顯示java輸出流的進度和超時
在移動設備上,有時網絡連接可能會非常糟糕,發送可能會花費太長時間。我有以下兩個基本問題:
- 用戶無法知道上傳
- 進度的方式,如果網絡是可怕的和進步糟糕 - 我寧願只是中止或有一些合理的超時而比坐在那裏嘗試5-10分鐘。
問題1:
我試圖根據我的OutputStream寫入顯示上傳進度()調用,我與4K緩衝區做:
buffer = new byte[4096];
long totalBytes = 0;
while ((bytesRead = fis.read(buffer)) > -1) {
totalBytes += bytesRead;
dos.write(buffer, 0, bytesRead);
if(showProgress){
updateProgressBar(totalBytes);
}
}
雖然這顯示了我的進步,它似乎只是顯示了應用程序可以將文件緩衝區傳輸到OS網絡堆棧緩衝區的速度。即使在慢速網絡上,進度條也可以很快完成,然後在我終於從我的服務器獲取JSON後告訴我發送狀態,然後再坐在那裏很長時間。當我將服務器傳遞給操作系統時,我的服務器告訴我它已收到它,當然有一些方法可以取得一些進展?
問題2:
有時網絡連接是壞的,但沒有足夠的硬件無線電觸發器沒有找到連接(在這種情況下,我進入了離線模式)回調壞。所以,當它不好,但不是關我的應用程序將只是坐在那裏發送對話框,直到奶牛回家。這是連接到問題1,因爲我需要以某種方式知道實際的吞吐量,因爲OutputStream本身不提供超時機制。如果它低於某個門檻,我可以取消連接,並通知用戶他們需要得到合適的接待處。
側面說明:異步發送/輸出隊列是不是一種選擇,對我來說,因爲我不能堅持一個消息到磁盤,因此不能保證起草的消息是無限期它不能在稍後的時間點發送的情況。我需要/想要阻止發送,我只需要更聰明地放棄和/或通知用戶發生了什麼。