Если не работает несколько активных процессов одновременно, этого не должно происходить.
Я предполагаю (не видя код), что сборщик мусора работает слишком много. Вы инициализируете объекты в цикле? Если да, можете ли вы использовать объекты вместо этого?
Объектами может быть что угодно, особенно Views. Убедитесь, что вы повторно используете ваши представления, а не создавать новые.
Еще один момент, который следует учитывать: перерисовка полного макета : можете ли вы перерисовать только часть экрана вместо всего этого? (т. е. используйте view.invalidate(rect);
вместо view.invalidate();
)
Наконец, ваши макеты слишком глубокие ? Постарайтесь сделать их как можно более плоскими. Например, используйте RelativeLayout
вместо вложенного LinearLayouts
.
Найдите время посмотреть это видео: Romain Guy's Google I / O 2009 talk . Оттуда можно получить много информации.
После обновления я вижу, что у вас есть 8K изображений для рисования. Если вы создадите все их экземпляры, скорее всего, в памяти мало места для чего-либо еще, поэтому GC нужно будет постоянно собирать все, что может. Это означает замедление всей системы. Проверьте, на том же видео, вопросы и ответы около 53-55 мин. Он предлагает в таких ситуациях, как ваша, иметь все ссылки на растровые изображения в HashMap из мягких ссылок, чтобы GC мог собрать неиспользуемые изображения при необходимости. Это предотвратит сбор чего-либо еще.
Я бы также создавал их экземплярами по мере необходимости вместо того, чтобы делать все это в начале.