Как освободить фактическую память объекта Activity после выхода из действия? - PullRequest
5 голосов
/ 26 июля 2011

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

Я попытался исследовать эту тему и обнаружил, что метод recycle () обычно является проблемой. Тем не менее, я вызвал метод recycle для каждого из растровых изображений (которые хранятся в контейнере объектов, хранятся в массиве), но проблема все еще возникала.

После этого я попытался с помощью Eclipse Memory Analyzer посмотреть на дампы кучи, когда натолкнулся на что-то странное. После выхода из действия (обратно в действие средства запуска, а затем снова открывая действие с помощью кнопки, я сделал снимки экрана дампа кучи с помощью анализатора памяти. Оказывается, каждый раз, когда я выходил и снова вводил Activity, был создан другой экземпляр объекта Activity, а старые не были освобождены, даже несмотря на то, что вызывался метод onDestroy (), который также имел код recycle / cleanup.

Затем я попытался переопределить метод finalize, чтобы посмотреть, вызывается ли он, когда действие выходит обратно в действие средства запуска, но не вызывается. Я читал в некоторых других потоках stackoverflow, что finalize () вызывается не всегда, поэтому, в конце концов, я все еще не уверен, что происходит.

В конечном счете, мой вопрос таков: Как я должен обеспечить, чтобы объект Activity (сам объект действия, а не материал, созданный из действия) был выпущен после выхода из действия в другое действие?

Ответы [ 3 ]

3 голосов
/ 15 октября 2011

Похоже, ваше приложение страдает от утечек памяти, я рекомендую вам перейти по ссылкам ниже:
Предотвращение утечек памяти

Управление памятью для приложений Android

0 голосов
/ 15 октября 2011

Один из способов освободить ваш объект активности - вызвать его методом onDestoy (). Возьмите объект вашей активности, сделайте его общедоступным статическим и сделайте его пустым в onDestroy ()

Public static Your_activity obj;

И затем вМетод onCreate инициализирует объект obj этим

obj=this;

, а в методе onDestroy () сделайте это:

obj= null;
0 голосов
/ 26 июля 2011

Один из вариантов - установить режим запуска на SingleInstance или SingleTask в файле манифеста.Это позволит убедиться, что другой экземпляр действия не создан.

Пример документации

...