2014-11-24 7 views
1

Я получаю исключение OutOfMemoryError, появившееся после нескольких загрузок основного экрана моих приложений. Приложение загружает данные и фоновое изображение о местоположении. Есть несколько вариантов выбора, и после 5-6 разных вариантов выбора куча превышает 192 МБ, и я получаю свою ошибку. Я считаю, что проблемы сводятся к тому, что я плохо использую растровые изображения.OutOfMemoryError - Разрушение размера кучи с растровыми изображениями

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


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

Затем я делаю это снова, ту же функцию, но в другом месте, с другим изображением.

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

+0

192MB гораздо больше, чем вы будете получать в большом количестве телефонов. Обычно вам нужно спуститься до ~ 32 МБ. К счастью, эти устройства обычно имеют менее плотные экраны, поэтому вам не нужно зацикливать на экране столько пикселей. Это полезный ресурс для обработки растровых изображений: http://developer.android.com/training/displaying-bitmaps/index.html – asdasd

ответ

1

Вам необходимо переработать растровые изображения, которые вы больше не используете. Убедитесь, что вы одновременно используете ограниченное количество экземпляров Bitmap, и каждый раз, когда вы заканчиваете использование растрового изображения, вызывается его метод «recycle()».

Вы можете найти более подробную информацию здесь: Managing Bitmap Memory & Caching Bitmaps

+0

Должен ли dalvik позаботиться об этом, если больше нет ссылок на этот растровый рисунок? – jvrodrigues

+0

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

+0

@Twentyonehundred, согласно информации, приведенной в ссылке выше, требуется явный запрос на переработку до Android 2.3.3 (в том числе), но не требуется для более поздних версий. Может быть, они улучшили алгоритм сбора мусора. Что касается времени перекоса - рекомендуется как можно скорее вызвать переработку, когда вы не собираетесь использовать этот экземпляр растрового изображения. См. Также полезное чтение о кешировании растровых изображений: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html –

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