Я пишу программу, которая включает в себя тонну изображений, более 100 на плотность экрана. К счастью, они не очень большие с точки зрения пространства. Я использую примерно 11 в любой момент времени. Я также использую функцию Bitmap.createScaledBitmap
на каждом изображении, которое, кажется, занимает много памяти.
Пока что при отладке этого приложения я, кажется, могу использовать его бесконечно, не сталкиваясь с проблемой памяти, которая, я надеюсь, означает, что я не теряю память.
Однако я заметил одну вещь: если я «выйду» из моего приложения с помощью кнопки «назад» (я ничего не запускаю в фоновом режиме), а вскоре после этого перезапущу приложение, я иногда получаю ошибки памяти при звонке на Bitmap.createScaledBitmap
01-07 19:01:24.935: ERROR/AndroidRuntime(27419): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
Итак, в основном мой вопрос: что я здесь не так делаю? Нужно ли убирать мой собственный мусор, как в onDestroy, когда пользователь нажимает кнопку «Назад»? Я бы подумал, что GC автоматически позаботится об этом, когда будет нажата кнопка «Назад» и активность будет уничтожена. Это заставляет меня поверить, что я делаю что-то еще не так, как утечка памяти. Но потом я возвращаюсь к тому факту, что мое приложение может интенсивно использовать память в течение 20 минут, а затем убить себя через 5 секунд после перезапуска, что меня и сбивает с толку.
Спасибо всем.
Редактировать: я реализовал пару быстрых и грязных исправлений.
Сначала я попробовал это, и было сложнее заставить приложение принудительно закрыться.
@Override
public void onBackPressed() {
finish();
}
Затем я попробовал это в сочетании с onBackPressed и больше не мог дублировать мою проблему. Обратите внимание, что вызов метода - это просто цикл, который в основном выполняет allImages = null;
protected void onStop () {
super.onStop();
mComponent.releaseImages();
}
В этот момент кажется, что после вызова finish () в действии все еще остаются объекты в памяти. Довольно странно.