2012-03-21 3 views
6

В моем приложении я использую простую галерею и обложку У меня есть галерея изображений обложки на изображении, щелкнуто в обложке, я перенаправлен на следующую операцию, содержащую полноэкранную галерею и я могу даже прокрутить мою полноэкранную галерею; , но когда я помещаю больше изображения или изображений с высоким разрешением в свое приложение, он получает силу закрытой из-за размера растрового изображения, превышающего бюджет VMКак удалить или очистить память кучи динамически в моем коде

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

+0

Вы можете прочитать, посмотрите, что сказал romane парень о графике и растровых изображениях. – JoxTraex

ответ

31

Вы не можете «очистить кучу». виртуальная машина будет делать это автоматически, когда ваши объекты больше не будут ссылаться.

Это, как говорится, растровые изображения - это жесткая вещь в андроиде. Там ограниченная память, и когда изображение декодируется в растровое изображение, оно может занимать намного больше памяти, чем сам формат сжатого изображения.

Нет простого ответа на ваше решение. Даже если вы все сделаете правильно, вы можете просто исчерпать память. При этом здесь приведены некоторые советы:

  1. Использование Bitmap.release(). растровые изображения являются особенными в том, что они выделяются в куче исходного стека (в отличие от VM). Javadocs немного нечеткие, говоря, что вам обычно не нужно вызывать это, но, по моему опыту, эта «подсказка» для виртуальной машины, которую вы сделали с поддержкой памяти, имеет важное значение. EDIT: с Android 3.0 (уровень API 11) данные пикселя хранятся в куче Dalvik вместе с соответствующим растровым изображением.

  2. Загрузка растровых изображений в память масштабируется. Вот blog post по теме. Вы получаете только кучу 24 МБ на некоторых устройствах, и изображение с высоким разрешением может исчерпать все это, когда оно загружается в растровый объект. Нет никакого способа обойти это, поэтому вы должны загрузить его масштабированным.

  3. Не называть System.gc() еще одним ответом. Люди, которые построили алгоритм GC, умнее, чем вы и я; Они знают, что делают. Вы никогда не получите OOME, когда есть память, которую можно освободить через GC - GC всегда будет работать, прежде чем предоставить OOME.

  4. Это очевидно, но убедитесь, что вы не держите ссылки на растровые изображения, когда они больше не нужны.

  5. И, наконец, и это отстой, Android не делает уплотнение кучи. Вот SO question Я опубликовал его некоторое время назад, без удовлетворительного ответа. В двух словах, Android никогда не сжимает кучу, так как ваше приложение продолжает выделять большие или даже средние размеры блоков для растровых изображений, вы в конечном итоге оказываетесь в ситуации, когда, пока вы не в памяти, не существует достаточно больших смежных кусок памяти для вашего распределения, и вы получаете OOME. только путь вокруг этого, как я писал в моем вопросе, заключается в том, чтобы убить процесс приложения, когда пользователь завершает работу. Это сделает запуск медленнее в следующий раз, но гарантирует новую кучу. Не поймите меня неправильно, я не могу поверить, что это правильно, но никто не придумал лучшего решения.

+1

Хорошее объяснение информации о романе +1. – JoxTraex

+0

это не «информация о романе». я не знаю, о чем вы говорите. –

+0

Он один из инженеров-инструментаристов ui в Google, что вы только что сказали, является базовым, что он сказал. И его имя ручка румынги. – JoxTraex

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