Android - Разные обои для каждого домашнего экрана - OutOfMemory - PullRequest
0 голосов
/ 23 июля 2010

Я пытаюсь установить разные обои для каждого домашнего экрана, но у меня возникают проблемы с OutOfMemory.У меня есть 5 растровых изображений, которые я пытаюсь наложить на растровое изображение, которое в 5 раз больше ширины экрана.Используя код ниже, я получаю OOM.Кажется, проблема в первой строке кода, которая создает большие обои на рабочий стол.У меня вопрос, есть ли способ сделать это (то есть каким-то образом, который занимает меньше памяти, или как-то выделить больше памяти?)Спасибо!

 Bitmap wallpaper = Bitmap.createBitmap(displayWidth*5,displayHeight, Config.ARGB_8888);
 Canvas canvas = new Canvas(wallpaper);
 Uri data = getIntent().getData();
 Bitmap bmp = getBitmap(data, imagePosition, displayWidth, displayHeight);
 canvas.drawBitmap(bmp, 0, 0,null);
 WallpaperManager wallpaperManager = (WallpaperManager) SetterActivity.this.getSystemService(Context.WALLPAPER_SERVICE);
 wallpaperManager.setBitmap(wallpaper);
 wallpaperManager.suggestDesiredDimensions(bmp.getWidth()*2, bmp.getHeight());

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

Растровые данные размещаются в собственной куче (подробности см. BitmapFactory OOM ).Доступный объем зависит от платформы (например, уровень API 2.2 имеет общую сумму кучи в 24 млн.), Но нет способа вырастить ее до этого уровня.И то, сколько выделенного пространства собственной кучи выделено, зависит от того, что ваши и другие приложения делают с растровыми изображениями / графикой.

Ваша первая строка растрового изображения кода / обоев имеет размер только 480 * 800 * 32/8 = 1,536 Мбайт, что вполне в пределах максимума.Таким образом, представляется вероятным, что большая часть кучи уже выделена к тому времени, когда вы доберетесь до этой строки?

Обратите внимание, что собственная куча собирается мусором, но редко - и данные не восстанавливаются, если приложение явно не освобождаетсяЭто.Поэтому, если вы работали с приложением, не перерабатывая свои растровые изображения (в onDestroy), вы вполне могли бы съесть кучу Native после нескольких запусков.

0 голосов
/ 16 августа 2010

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

То есть у вас есть 2 растровых изображения в памяти, одно - current, а другое - next. Загрузите растровое изображение current при первом просмотре. Используйте onOffsetsChanged, чтобы определить, когда происходит прокрутка, и в этот момент загрузите растровое изображение next в зависимости от того, какой домашний экран будет отображаться следующим. Вам нужно будет выполнить эту интерполяцию с экрана A на B самостоятельно. когда свиток закончен, переработайте current и сохраните next как current.

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

...