2012-02-11 3 views
3

У меня есть приложение для Android, которое загружает около 30 битмап в память. Это jpg-ресурсы, которые составляют 455x320 пикселей.Ошибки OutOfMemory с растровым изображением на LiveWallpaper на Galaxy Nexus

Это работает на всех устройствах, которые я тестировал с G1 на Galaxy Nexus.

У меня есть другая версия этого приложения, которое является LiveWallpaper. Он работает на Nexus One, Milestone, Galaxy S2 и некоторых планшетах 3.x. Однако, версия LWP моего приложения падает с ошибками OutOfMemory только на Galaxy Nexus (на ICS).

представляет собой упрощенную версию кода, я использую следующие:

Bitmap bitmap = BitmapFactory.decodeResource(
    lwpService.getResources(), R.drawable.somepic); 
imageCache.put(R.drawable.somepic, bitmap); 
bitmap = BitmapFactory.decodeResource(
    lwpService.getResources(), R.drawable.someotherpic); 
imageCache.put(R.drawable.someotherpic, bitmap); 
… // and so on for 30 more images. 

Вот трассировки стека из LogCat:

02-12 00:07:34.456 E/dalvikvm-heap(6938): Out of memory on a 583696-byte allocation. 
02-12 00:07:34.456 I/dalvikvm(6938): "Thread-7378" prio=5 tid=16 RUNNABLE 
02-12 00:07:34.456 I/dalvikvm(6938): | group="main" sCount=0 dsCount=0 obj=0x4186c3f8 self=0x20e538 
02-12 00:07:34.456 I/dalvikvm(6938): | sysTid=7115 nice=0 sched=0/0 cgrp=default handle=2213784 
02-12 00:07:34.456 I/dalvikvm(6938): | schedstat=(0 0 0) utm=6907 stm=504 core=1 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.nativeCreate(Native Method) 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.createBitmap(Bitmap.java:551) 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437) 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524) 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499) 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351) 
02-12 00:07:34.456 I/dalvikvm(6938): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:374) 
02-12 00:07:34.463 I/dalvikvm(6938): at com.myapp.loadImage(MyApp.java:155) 

Кто-нибудь еще имел проблемы с загрузкой нескольких растровых изображений в памяти в LWP на Galaxy Nexus?

EDIT: Я нашел способ избежать OutOfMemoryErrors: так как мои конкретные изображения являются непрозрачными, мне не нужен альфа-канал, так что я могу использовать Bitmap.Config.RGB_565 вместо Bitmap.Config.RGB_8888. Таким образом, мои изображения используют половину памяти, как ранее.

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.RGB_565;  
Bitmap bitmap = BitmapFactory.decodeResource(
    lwpService.getResources(), R.drawable.somepic, options); 

Я не думаю, что это решение будет масштабироваться для более или больших изображений, так что я бы до сих пор заинтересован в других комментариях.

ответ

0

Ну, ваше решение уменьшило объем памяти на половину (4 байта на RGB_8888 до 2 байтов на RGB_565). Но настоящая проблема заключается в том, почему вам нужно загружать все изображения одновременно? Средний размер домашнего экрана на живых обоях составляет 960 x 800, поэтому в чем причина загрузки 30 455x320 изображений? Он не подходит, и даже если это решение работает на большинстве телефонов, вы используете огромный объем памяти. Я бы порекомендовал вам загружать изображения динамически, используя пул растровых изображений и перерабатывая его. Ура!

+0

Причиной для изображений с разрешением 320x455 является то, что это было первоначально приложение на G1, которое я позже адаптировал к живым обоям. Причина заключается в том, что они используются в различных анимациях. Я попытался не загружать и кэшировать их, но анимация стала довольно медленной. Я пробовал только загружать и кэшировать определенные изображения для данной анимации, но все же имел ошибки OOM. Я боюсь, что с пулом изображений, возможно, будет трудно найти оптимальный размер: слишком большой, и я получу ошибки OOM, слишком маленькие, и у меня будет прерывистая анимация. – Carmen

+0

Возможно, мне удастся оптимизировать мой код (кроме решения, которое я уже нашел). Но то, что меня озадачивает, состоит в том, что одна и та же логика работает на 2.x и 3.x, но не на 4.x. – Carmen

Смежные вопросы