#android #exception #memory
#Android #исключение #память
Вопрос:
У меня есть приложение, которое я пишу, в котором много растровых изображений. Если вы запустите приложение, выйдите из приложения и несколько раз вернетесь в приложение, в конечном итоге вы получите принудительное закрытие из-за нехватки памяти.
Я знаю, где происходит нехватка памяти, и мог бы выполнить try catch. Проблема в том, что если у меня нет памяти для запуска, что мне делать? Мое приложение просто не работает без растровых изображений, поэтому я не могу просто не показывать их.
Я пытался установить значение null, когда получаю onPause. Я пытался выполнить завершение в onPause. Я провел много исследований, прочитал много сообщений, прежде чем писать это электронное письмо, и попробовал многие предложенные вещи.
Суть в том, что память, которую я использую, похоже, просто не освобождается или происходит что-то еще.
Я попытался использовать команду adb shell cat / proc / meminfo между запусками и остановками, и вот что я нашел:
Общий объем памяти: 31348
Запустите приложение, все работает
Общий объем памяти: 18180
Выйдите из приложения
Общий объем памяти: 20160
Запустите приложение, все работает
Общий объем памяти: 12480
Выйдите из приложения
Общий объем памяти: 13740
Запустите приложение, все работает
Общий объем памяти: 9600
Выйдите из приложения
Общий объем памяти: 10844
Запуск приложения, первое исключение из памяти, одно из 5 растровых изображений просто не отображается, но сбоя нет
Общий объем памяти: 6224
Выйдите из приложения
Общий объем памяти: 7244
Запуск приложения, не запускается, заканчивается память, что вызывает ошибку, которую я улавливаю, поэтому завершается
Общий объем памяти: 7836
Запустите приложение, исключение нехватки памяти и принудительно закройте, нажмите кнопку принудительного закрытия
Общий объем памяти: 31648
Как вы можете видеть, память теперь окончательно освобождена, но только после принудительного закрытия.
Не имеет значения, запускаюсь ли я и выхожу очень быстро или жду между каждым запуском и завершением, происходит одно и то же, поэтому я не могу просто ввести задержку.
Есть ли способ «принудительно» принудительно закрыть, за исключением того, что на самом деле сообщение не отображается и не является условием ошибки? Я думал, что это то, что должна была делать finish (), но это не так.
Спасибо за любую помощь или идеи, которые я могу попробовать.
Комментарии:
1. Похоже, вы на самом деле не устанавливаете все в null, что вам нужно. Если вы опубликуете какой-нибудь код, показывающий все структуры данных, которые хранят ссылки на ваши растровые изображения, возможно, мы могли бы помочь. Кроме того, рассмотрите возможность использования средства отслеживания распределения (описанного здесь ).
Ответ №1:
У нас была такая же проблема с нашим приложением. К сожалению, нет «серебряной пули» для решения всех проблем с памятью. Вот пара вещей, которые вы можете попробовать:
я) Используйте мягкую ссылку / weak reference для растровых изображений, которые вы используете.
ii) Переработайте растровые изображения в вашем onPause и декодируйте их снова в вашем onResume. Поможет кэш растровых изображений с программными ссылками.
iii) Рассмотрите возможность использования RGB_565 вместо ARGB_8888 (который теперь используется по умолчанию в Gingerbread).
iv) Убедитесь, что нет утечек или нескольких экземпляров вашей активности / activities.
Надеюсь, это поможет.