2011-02-27 19 views
5

Telefonumu Gingerbread'a bugün güncelledim (2.3.2) ve geliştirdiğim bir uygulamayı başlattım ve verilerini yüklemediğini gördüm. Uygulama, Android'in diğer her sürümünde 1.6'dan 2.2'ye kadar test ettim, ancak Gingerbread'da bir IOException uyguluyor. GZipInputStream veya URL.openStream() öğesinde bir şey değişip değişmediğini bilen var mı?GZIPInputStream, Android 2.3'te IOException ile başarısız oluyor, ancak önceki tüm sürümlerde iyi çalışıyor mu?

sorunlu kod aşağıdaki benzer: 2.2 1.6, bu kod 2.3 de, gayet iyi çalışıyor

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; 
} 

sihirli blok yanlış olma konusunda bir mesajla bir IOException olsun. MIME türünü veya bu verilerdeki bir şeyi dağıtan openStream ile bir şeyler değiştiğini varsayıyorum. OpenStream'in HTTP bağlantılarını ele almanın en güvenilir yolu olmadığı diğer yerleri okudum, bu yüzden bağlantı kodumu yeniden düzenlemek için iyi bir bahane olabilir.

+1

HttpClient'i kullanmak için kodu değiştirir ve üzerinde bir HttpGet isteği kullanırsam iyi çalışır. URL.openStream() işlevinde bir şey kırılmış olmalıdır. Oh, umarım bu, bir başkasını bir süre daha kurtarmaya yardımcı olur. –

cevap

4

Burada aynı sorunla karşılaşıyorum. Gingerbread'ın (2.3) GZipli akışların ele alınış şeklini değiştirdiği görülüyor. "Sihirli blok" karakterlerine bakıldığında, openStream() öğesinin GZiplenmiş verileri otomatik olarak algıladığı ve doğru akış kod çözücüsünü kullanarak çalıştırdığı gösterilir. Elbette, aynı akış üzerinde başka bir GZIP kod çözücüsü çalıştırmayı denerseniz, bu bir IOException ile başarısız olur.

Bunu işlemenin birkaç yolu vardır. İlk yol HttpClient/HttpGet'e geçmek. ANCAK, bunun gelecekte de değişmeyeceğine dair bir garanti yoktur. Temel olarak, tekrar işe yaratabilmek bir hack. Daha kapsamlı bir çözüm yapmak olabilir: Android'in daha yeni sürümlerinde, Android'in eski sürümlerinde, döküm çalışırken bir istisna yangınlar için

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

ve dökme başarılı olur. Bir istisna eylemcisini bu şekilde kötüye kullanmak hoş değil ama işe yarıyor. Bu, tabii ki, GZIP sıkıştırılmış veri gibi görünen sıkıştırılmış veya ikili veri olan temel veri için bir sorun olacaktır. Android Devs bu değişiklik değil bir hata olduğunu düşünüyorum:

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

ben katılmıyorum. Bu ciddi kırılmadır.

İlgili konular