2011-02-27 1 views
5

오늘 휴대 전화를 진저 브레드 (2.3.2)로 업데이트하고 내가 개발 한 앱을 해고하여 데이터로드에 실패했는지 확인했습니다. 이 응용 프로그램은 1.6에서 2.2까지 테스트 한 Android의 다른 모든 버전에서 잘 실행되지만 진저 빵에서는 IOException이 발생합니다. 아무도 뭔가 GZipInputStream 또는 URL.openStream() 변경된 경우 알고 있습니까?GZIPInputStream은 안드로이드 2.3에서 IOException과 함께 실패하지만, 이전의 모든 릴리스에서 잘 작동합니까?

문제가있는 코드는 다음과 유사한 : 2.2-1.6,이 코드는 2.3에서 잘 작동

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

나는 마법의 블록이 잘못된 것에 대해 메시지와 함께 IOException를 얻을. openStream을 사용하여 MIME 형식이나이 데이터의 내용을 엉망으로 만든 무언가가 변경되었다고 가정합니다. openStream이 HTTP 연결을 처리하는 가장 신뢰할 수있는 방법이 아닌 다른 곳을 읽었으므로 연결 코드를 다시 작성하는 것이 좋습니다.

+1

HttpClient를 사용하고 HttpGet 요청을 사용하도록 코드를 변경하면 올바르게 작동합니다. 뭔가 URL.openStream() 함수에서 깨진 있어야합니다. 오 잘, 잘하면이 시간 누군가 다른 사람을 구하는 데 도움이됩니다. –

답변

4

여기에도 같은 문제가 있습니다. Gingerbread (2.3)가 GZipped 스트림을 처리하는 방식을 변경 한 것 같습니다. "magic block"문자를 보면 openStream()이 자동으로 GZipped 데이터를 감지하여 올바른 스트림 디코더를 통해 실행한다는 것을 나타냅니다. 물론 같은 스트림에서 다른 GZIP 디코더를 실행하려고하면 IOException이 발생하여 실패합니다.

이 문제를 처리 할 수있는 몇 가지 방법이 있습니다. 첫 번째 방법은 HttpClient/HttpGet으로 전환하는 것입니다. 그러나 이것이 미래에도 변하지 않을 것이라는 보장은 없습니다. 기본적으로 다시 작동하도록 해킹하는 것입니다. 보다 완벽한 솔루션이 할 수 있습니다 : 안드로이드의 새로운 버전, 안드로이드의 이전 버전, 캐스팅을 시도하는 동안 예외 화재가 발생한 경우

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

하고, 캐스트는 성공합니다. 이런 식으로 예외 처리기를 악용하는 것은 좋지 않지만 작동합니다.

이것은 압축 된 기본 데이터 또는 GZIP 압축 데이터 인 이진 데이터에 대한 문제입니다. 안드로이드 devs 명령이 변경되지 버그라고 생각 :

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

나는 동의하지 않는다. 이것은 심각한 파손입니다.

관련 문제