2011-05-05 20 views
1

首先,我有一個擴展AsyncTask的類。然後在doInBackground()方法中,我有一些發佈HTTP POST消息的代碼,並獲得響應。Android getInputStream()不檢索所有字節,但只是零星地檢索

DataInputStream dis = new DataInputStream(conn.getInputStream()); 
byte[] data = new byte[32768]; 
len = dis.read(data, 0, 32768); 

if (len > 0) 
{ 
    response = new String(data, 0, len); 
} 

此時,反應應該是4127個字節(由服務器證實):此反應如下被讀入的字符串。它的1/5時間是4127字節。時間的2/5是1205個字節,時間的2/5是3853個字節。我可以關閉應用程序,重新安裝,並獲得相同的變化。

管理服務器的人會記錄所有內容,並且可以確認相同的數據一遍又一遍地被髮送。但Android並沒有獲得全流。這是無線的,不是3G。當我使用調試器時,我可以看到返回的字符串總是相同的,只是在隨機點切斷。

對不起,這樣的模糊(愚蠢嗎?)的問題,但我一直在看這幾個小時,我看不出有什麼地方錯了...

回答

1

read方法文檔說:讀取將包含的輸入流中的最多len個字節的數據轉換爲字節數組。嘗試讀取多達len字節,,但較小的數字可能被讀取爲,可能爲零。實際讀取的字節數作爲整數返回。

根據不同的條件,有時您可以讀取所有服務器發送的數據,有時候會有短讀。爲了獲得所有數據,您應該繼續讀取流中的數據,直到len爲-1,表示EOF。

InputStream in = ...; 
byte[] dst = new byte[32768]; /* Assuming total len is < 32768 */ 
int idx = 0; 
do { 
    int len = in.read(dst, idx, 32768 - idx); 
    idx += len; 
} while (len >= 0 || idx < 32768); 
+0

非常感謝! – Paul 2011-05-06 13:04:05