Как не забивать оперативную память в Android?

Рейтинг: 0Ответов: 3Опубликовано: 06.02.2015

Есть приложение, в нем есть много различных Activity, в свою очередь в них есть картинки. Когда я запускал приложение и в MemoryMonitor смотрел на использование памяти, я увидел, что при открытии одного Activity память загружается, примерно на 10 мб, и так получается, что те Activity, с которых я перешел, они содержатся в памяти, и при повторном их открытии уже не грузит память.

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

Ответы

▲ 2Принят

На мой взгляд, основные поедатели памяти - это ImageView. Один 3 мб шный png -шник может занимать 20 мб оперативы. Поэтому надо прежде всего с ними быть аккуратнее + они не всегда уничтожаются при выходе из активити, лучше их чистить ручками.

А вообще жрать по 100 мб оперативы для запущенной во весь экран проге (т.е. не фоновой) вполне нормально (в этом плане далвик вполне похож на jvm :))

▲ 4

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

▲ 3

Не согласен насчёт очистки в onPause!!! Категорически!!! Начнём с того, что ресурсы должны чистится в методе onDestroy службы, ибо сказано - все тяжеловесные задачи должны выполнятся в отдельных потоках. А для андроида есть удобная вещь для этих целей - служба. А если держать что-то тяжелое в активити и закрывать ресурсы в onPause/onStop (и открывать их заново при onResume/onStart), то это будет происходить при каждом перевороте экрана и при сворачивании активити на задний план.

ЗЗЫ Из-за чего вылетал OOM error? У меня такое было только при засирании памяти огромными картинками 2000 Х 2000 разрешением. Пришлось писать стек специальный и вызывать recycle() для bitmap объектов.