Исключения из-за недостатка памяти в Android - PullRequest
0 голосов
/ 06 мая 2011

У меня есть приложение, которое я пишу, оно тяжело с растровыми изображениями. Если вы запустите приложение, выйдите из приложения и зайдите в него несколько раз, в конце концов вы будете вынуждены закрыть из-за нехватки памяти.

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

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

Суть в том, что используемая память просто не освобождается или что-то еще происходит.

Я пытался использовать команду adb shell cat / proc / meminfo между запусками и остановками, и вот что я нашел:

MemTotal: 31348

Запустите приложение, все работает

MemTotal: 18180

Выход из приложения

MemTotal: 20160

Запустите приложение, все работает

MemTotal: 12480

Выход из приложения

MemTotal: 13740

Запустите приложение, все работает

MemTotal: 9600

Выход из приложения

MemTotal: 10844

Запустить приложение, первое исключение памяти, одно из 5 растровых изображений просто не отображается, но без сбоев

MemTotal: 6224

Выход из приложения

MemTotal: 7244

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

MemTotal: 7836

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

MemTotal: 31648

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

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

Есть ли способ "принудительно" принудительно закрыть, кроме как не показывать сообщение и не быть ошибкой? Я думал, что это именно то, что должна делать функция finish (), но это не так.

Спасибо за любую помощь или идеи, которые я могу попробовать.

1 Ответ

0 голосов
/ 06 мая 2011

У нас была та же проблема с нашим приложением.К сожалению, нет «серебряной пули» для решения всех проблем с памятью.Вот несколько вещей, которые вы можете попробовать:

i) Использовать мягкую ссылку / слабую ссылку для используемых вами растровых изображений.
ii) Перерабатывать растровые изображения в вашей onPause и снова декодировать их в вашем onResume.Помочь будет кэш с мягкими ссылочными битовыми картами.
iii) Подумайте об использовании RGB_565 вместо ARGB_8888 (который сейчас используется по умолчанию в Gingerbread).
iv) Убедитесь, что нет утечек или нескольких экземпляров вашей активности / действий.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...