2011-02-27 50 views
5

我今天更新了手機薑餅(2.3.2),並啓動了一個我開發的應用程序,看到它沒有加載它的數據。該應用程序運行良好,我已經測試從1.6到2.2的每個其他版本的Android,但然後在薑餅IOException。有人知道GZipInputStream或URL.openStream()中是否發生了變化?GZIPInputStream在Android 2.3中失敗並出現IOException異常,但在以前的所有版本中工作正常?

有問題的代碼是類似以下內容:

InputStream in = null; 
GZIPInputStream zin = null; 
URL url = null; 
try { 
    url = new URL("http://www.test.com/gzipped_data.gz"); 
    in = url.openStream(); 
    zin = new GZIPInputStream(in); 
} 
catch (MalformedURLException e) { 
    return false; 
} 
catch (IOException e) { 
    return false; 
} 

在1.6〜2.2,此代碼工作正常,在2.3我得到一個IOException,使用一個關於魔塊是不正確的消息。我假設openStream發生了一些變化,這些數據混淆了MIME類型或其他內容。我讀過其他openStream並不是處理HTTP連接最可靠的方法,所以這可能是重寫我的連接代碼的好藉口。

+1

工作正常,如果我更改代碼使用HttpClient並使用HttpGet請求。 URL.openStream()函數中必須有一些內容被破壞。哦,希望這會幫助別人節省一些時間。 – 2011-02-28 03:45:03

回答

4

我在這裏遇到同樣的問題。看起來薑餅(2.3)改變了GZipped流的處理方式。查看「魔術塊」字符表明openStream()會自動檢測GZipped數據並通過正確的流解碼器運行它。當然,如果您嘗試在同一個流上運行另一個GZIP解碼器,那麼IOException將會失敗。

有幾種方法可以解決這個問題。第一種方法是切換到HttpClient/HttpGet。但是不能保證這在將來也不會改變。基本上,這是一個黑客讓它再次工作。更完整的解決方案可能是要做到:

InputStream in = url.openStream(); 
GZIPInputStream zin; 
try { 
    zin = (GZIPInputStream)in; 
} catch (Exception e) { 
    zin = new GZIPInputStream(in); 
} 

對於舊版本的Android系統,同時試圖投異常火災,在Android的新版本,轉換成功。以這種方式濫用異常處理程序並不美觀,但它起作用。

這當然會成爲壓縮或二進制數據看起來像GZIP壓縮數據的底層數據的問題。 Android的開發者認爲這種變化是不是一個錯誤:

http://code.google.com/p/android/issues/detail?id=16227

我不同意。這是嚴重的破損。

相關問題