2014-03-27 92 views
4

我目前正在開發一個Android應用程序並遇到以下問題。 我正在向一個服務器發送一個HTTP請求,該服務器應該將我發回的XML內容發送給我,然後再解析。在解析長XML字符串時,我注意到了循環錯誤,因此我決定顯示我的請求的結果,並發現我收到的字符串(或流?)被隨機截斷。有時我會得到整個字符串,有時候是一半,有時候是三分之一,而且它似乎遵循了被截斷的字符數量的特定模式,我的意思是,我有時會在請求之後獲得320個字符,然後在156個字符之後獲得156個字符接下來是320兩次,然後是156(這些不是實際的數字,但它遵循一個模式)。Android HttpUrlConnection結果字符串截斷

這裏是我的請求和InputStream的轉換成字符串代碼:

private String downloadUrlGet(String myurl) throws IOException { 
    InputStream is = null; 
    // Only display the first 20000 characters of the retrieved 
    // web page content. 
    int len = 20000; 

    try { 
     URL url = new URL(myurl); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(10000 /* milliseconds */); 
     conn.setConnectTimeout(15000 /* milliseconds */); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     conn.setRequestProperty("Content-Type", "application/xml"); 
     // Starts the query 
     conn.connect(); 
     int response = conn.getResponseCode(); 
     Log.d(DEBUG_TAG, "The response is: " + response); 
     is = conn.getInputStream(); 

     // Convert the InputStream into a string 
     String contentAsString = readIt(is, len); 
     return contentAsString; 

    // Makes sure that the InputStream is closed after the app is 
    // finished using it. 
    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 
} 

// Reads an InputStream and converts it to a String. 
private String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException { 
    Reader reader = null; 
    reader = new InputStreamReader(stream, "UTF-8");   
    char[] buffer = new char[len]; 
    reader.read(buffer); 
    return new String(buffer); 
} 

,我嘗試檢索XML的長度遠小於20000 我試圖使用HttpURLConnection類。 setChunkedStreamingMode()用0和各種其他數字作爲參數,但它沒有改變任何東西。

在此先感謝您的任何建議。

+0

在你的「readIt」你的讀取輸入流中只有一次,從緩衝區中獲取一小塊數據。您需要重複閱讀才能結束。 –

回答

1

假設read()填充緩衝區時,您犯的錯誤通常是錯誤的。看到Javadoc。它沒有義務這樣做。事實上,它不一定要傳送多於一個字節。您需要循環讀取,直到遇到流結束(read()返回-1)。

+0

謝謝,我設法通過讀取流一個字符一次,並將其附加到一個字符串,但我仍然無法弄清楚如何使它使用緩衝區和讀取(char []緩衝區,int偏移量,int count)就像他們在官方的Android教程中做的那樣... –

+0

'while((count = in.read(buffer))> 0){str + = new String(buffer,0,count); }' – EJP

+0

如果您使用多字節編碼(例如UTF-8),則上述讀取字符串的方法是錯誤的。如果緩衝區以一個多字節字符結束一半,則會拋出。而是使用'StreamReader'或類似的東西。 –