안드로이드 개발 질문/답변
(글 수 45,052)
현재 구현중인 App이 일종의 이미지 뷰어 입니다.
성능 향상을 위해 ( 이미지가 무거울때를 위해서 )
갤러리를 사용하고 Adapter 쪽에서 getView 호출시
먼저 BitmapFactory.Options.inSampleSize 를 이용하여 작은 이미지를 반환합니다.
그리고 백그라운드에서 진짜 이미지를 가져와서 기존의
작은 이미지를 대체 합니다.
이때 작은 이미지나 큰 이미지나 가져오는 메소드는 동일합니다.
BitmapFactory.Options.inSampleSize 의 값으로 콘트롤 할 수 있습니다.
근데 불규칙하게 백그라운드로 작업 하는 큰 이미지를 가져올때 BitmapFactory 내부에서 에러가 납니다.
작은 이미지를 가져오는것은 항상 정상 동작하고요
BitmapFactory.Options option = new BitmapFactory.Options(); option.inSampleSize = n; InputStream is = getInputStream((int)p, absolutePath); bitmap = BitmapFactory.decodeStream(is, null, option);
bitmap = BitmapFactory.decodeStream(is, null, option);
해당 메소드에서 에러가 나는 부분입니다.
InputStream 이 null 도 아닙니다.
D/dalvikvm( 1998): GC freed 1352 objects / 258560 bytes in 112ms W/System.err( 1998): java.io.IOException W/System.err( 1998): at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:210) W/System.err( 1998): at java.io.FilterInputStream.read(FilterInputStream.java:138) W/System.err( 1998): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:157) W/System.err( 1998): at java.io.BufferedInputStream.read(BufferedInputStream.java:346) W/System.err( 1998): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) W/System.err( 1998): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459) W/System.err( 1998): at ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(AAAA.java:1154) W/System.err( 1998): at qqqqqqqq$ImageLoad.doInBackground(Adapter.java:128) W/System.err( 1998): at qqqqqqqq$ImageLoad.doInBackground(Adapter.java:1) W/System.err( 1998): at android.os.AsyncTask$2.call(AsyncTask.java:185) W/System.err( 1998): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) W/System.err( 1998): at java.util.concurrent.FutureTask.run(FutureTask.java:137) W/System.err( 1998): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) W/System.err( 1998): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) W/System.err( 1998): at java.lang.Thread.run(Thread.java:1096) W/System.err( 1998): Caused by: java.util.zip.DataFormatException: buffer error W/System.err( 1998): at java.util.zip.Inflater.inflateImpl(Native Method) W/System.err( 1998): at java.util.zip.Inflater.inflate(Inflater.java:272) W/System.err( 1998): at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:191) W/System.err( 1998): ... 14 more D/skia ( 1998): ---- read threw an exception D/skia ( 1998): --- decoder->decode returned false
로그켓입니다. 패키지명 클래스명은 감췄습니다. ^^;;
BitmapFactory.java:459 안으로 접근해 보면 결국 Native Method 라서 더 이상 접근도 안되네요
조언 부탁드립니다.
2010.02.24 23:59:20
BitmapFactory 로 decodeStream 호출 시 원본 이미지가 너무 큰 경우, OutOfMemory Exception 이 발생 하는 걸로 알고 있습니다. 혹시 그런 경우가 아닌가 의심되네요. Option 값에 inJustDecodeBounds 값을 true 로 설정 하신후, 우선 원본 이미지의 width 와 height 값을 구하신 후, 너무 클 경우 inSampleSize 의 값을 적절히 조절해 보시면 어떨까요?
2010.02.25 16:37:33
Caused by: java.util.zip.DataFormatException: buffer error ==> 이게 문제 인거 같은데요~
그러고 위에 설명하신 동작은 Android Gallery의 ImageGetter.java쪽 동작과 동일 한듯하구요~
문제는 Android이넘들이 Util.java에 보면 BitmapFactory.Options에 options.inNativeAlloc을 hide해 놓고 씁니다. 즉, Native Alloc을 사용하여 큰사이즈이미지를 Buffering에 사용하는것으로 보입니다. 그래서 동일한 Image라도 Gallery에서 열었을때는 안죽는듯합니다.
저들만 쓸라고 만든 inNativeAlloc 풀렸으면 합니다. 도움이 될지요~
그러고 위에 설명하신 동작은 Android Gallery의 ImageGetter.java쪽 동작과 동일 한듯하구요~
문제는 Android이넘들이 Util.java에 보면 BitmapFactory.Options에 options.inNativeAlloc을 hide해 놓고 씁니다. 즉, Native Alloc을 사용하여 큰사이즈이미지를 Buffering에 사용하는것으로 보입니다. 그래서 동일한 Image라도 Gallery에서 열었을때는 안죽는듯합니다.
저들만 쓸라고 만든 inNativeAlloc 풀렸으면 합니다. 도움이 될지요~