Исключение нехватки памяти при раздувании макетов

Я получаю случайные исключения из памяти в своем приложении, вызванные надуванием исключений.

У меня есть 7 действий фрагмента (сложности), которые запускают свои действия с помощью кнопок. Каждый фрагмент имеет вид прокрутки с 30 кнопками (уровнями). Я настроил его так, чтобы я мог прокручивать каждый фрагмент, и фрагмент занимает весь экран.

Иногда, когда я прокручиваю несколько раз, а затем выбираю случайную кнопку из группы из 30, происходит сбой. Он пытается загрузить действие и выдает исключение нехватки памяти с исключением надувания в случайной строке. Строка всегда попадает на imageView или imageButton в файле xml. Загружаемые действия представляют собой сетку изображений и кнопок изображения.

Я не очень часто получаю исключение, но это то, что я хочу исправить. Я рассмотрел много других вопросов об исключениях из памяти, хотя ни один из них не помог мне. Я сделал тест анализатора памяти, и он не показывает ничего необычного.

Я считаю, что imageViews и imageButtons используют слишком много памяти, хотя у меня одновременно открывается только одно действие.


person RhysBailey21    schedule 12.05.2015    source источник
comment
Вложенные макеты могут быть причиной этого. Сколько уровней?   -  person Muzaffer    schedule 12.05.2015


Ответы (3)


Это из-за ваших изображений, которые загружаются. Когда вы загружаете изображение, перемещаетесь по странице и просматриваете другое изображение, куча увеличивается. По мере того, как вы продолжаете процесс просмотра случайных изображений, куча растет еще больше, пока ваше приложение не рухнет. Это как складывать книги на стеклянный стол. Вы либо перемещаете (кешируете) книгу (изображение), либо разбиваете стекло (приложение). Вы должны использовать загрузчик изображений для загрузки ваших изображений.

https://github.com/nostra13/Android-Universal-Image-Loader

person SmulianJulian    schedule 12.05.2015
comment
Я понимаю что ты имеешь ввиду. Очень хорошее описание. Хотя, не лучше ли было бы «освежать» каждое изменение активности? - person RhysBailey21; 14.05.2015
comment
Нет, потому что ВЫ выполняете работу вместо загрузчика изображений. Меньше работы - хорошо. Я видел 0 ошибок нехватки памяти с загрузчиком изображений. Мне нравится переходить к другим, более динамичным аспектам того, что я создаю, возможно, вам понравится эта работа. :) - person SmulianJulian; 14.05.2015

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

Также вы упомянули, что у вас есть ScrollView, и это означает, что вы сохраняете в памяти каждые 30 элементов. Возможно, вам лучше изменить его на RecyclerView, поддерживаемый адаптером.

person Oleg Osipenko    schedule 12.05.2015
comment
Так что смена изображений на более низкое разрешение сработала... вроде. Сбоя почти не существует, если я действительно не пытаюсь его вызвать. Который большинство пользователей не будет доводить до предела, которым я являюсь. Хотя, я хочу, чтобы это полностью исчезло. ScrollView используется, потому что я хочу, чтобы мое приложение было доступно для Android 3.0 или выше. Использование recyclerView переместит его на Android 5.0. Я могу уменьшить потребность в памяти scrollView без использования recyclerView? - person RhysBailey21; 14.05.2015
comment
RecyclerView является частью библиотеки поддержки, которая доступна для API, начиная с SDK 7 и выше, что означает, что у вас есть обратная совместимость в случае использования RecyclerView. Также было несколько представлений с поддержкой адаптера, таких как ListView, GridView и т. д., начиная с версии SDK v1. Так что это не повод предпочесть ScrollView RecyclerView. - person Oleg Osipenko; 14.05.2015

У меня была такая же проблема, и я хотел бы упростить все сказанное здесь:

Просто: уменьшите размеры изображений.

Не используйте изображения 1080X1920... Это слишком высокое разрешение.

Такой образ, даже сжатый, при развертывании будет ловить около 1080X1920X4B = 8,2 МБ (ГП должен развернуть его до полного исходного разрешения... Поэтому сжатие не поможет, но уменьшит необходимый объем памяти...) и это i RAM, о которой мы говорим..

Возьмите Gimp или Photoshop и уменьшите изображение, скажем, до 1/4: 540X960, и вы не почувствуете разницы. Поверьте мне, я уже был там.

Остерегайтесь потребления памяти изображениями и видео.

Надеюсь это поможет,

Джеймс

person JamesC    schedule 06.11.2017