Ошибки OutOfMemory с растровым изображением на LiveWallpaper на Galaxy Nexus - PullRequest
3 голосов
/ 12 февраля 2012

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

Это работает на всех устройствах, которые я тестировал, от 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);

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

1 Ответ

0 голосов
/ 12 февраля 2012

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

...