Жизненный цикл активности Android и сохранение синглтонов и взаимных ссылок (утечки памяти)

Насколько я понимаю, нельзя ожидать, что синглтон будет хранить постоянные данные в приложениях Android, потому что приложение может быть уничтожено и воссоздано несколько раз в «очевидном жизненном цикле» приложения. Это само по себе не проблема для меня. Проблема заключается в том, что именно происходит, когда приложение проходит через этот процесс уничтожения -> создания.

Я читал на форумах, что приложение будет воссоздано в новом процессе, и я предполагаю, что старый процесс со всем его управлением памятью будет уничтожен. Однако означает ли это, что разработчик должен очистить все одиночки и логические деревья с узлами, содержащими взаимные ссылки? Или уничтожение процесса автоматически все подчищает? Я не опытный java-разработчик, поэтому мне многое еще неясно в сборщике мусора.

Конкретный проект, над которым я работаю, запускает только одно приложение в течение всего времени безотказной работы устройства. С точки зрения настольных компьютеров не было бы опасности утечки памяти через синглтоны, поскольку приложение закрывается только при выключении устройства и все время находится в одном и том же процессе. Однако Android усложняет задачу.

Кстати, какой хороший детектор утечки памяти для Android с помощью эмулятора?


person Rene    schedule 24.03.2013    source источник
comment
Что касается инструментов обнаружения утечек памяти: взгляните на этот подключаемый модуль Eclipse: eclipse.org/mat и это видео google io: youtube.com/watch?v=_CruQY55HOk   -  person Entreco    schedule 24.03.2013
comment
Благодарность! Я посмотрю на это!   -  person Rene    schedule 24.03.2013
comment
Об утечках памяти вы также можете проверить этот ответ: stackoverflow.com/questions/3714394/   -  person rekire    schedule 09.10.2015


Ответы (1)


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

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

Вы также должны знать, что вы можете обрабатывать эти события в своем коде. Это означает, что ваша деятельность не должна быть перезапущена. ИМХО практически нет смысла перезапускать актити. Чтобы реализовать это, вам нужно добавить в свой манифест атрибут configChanges. . Я лично использую этот конфиг:

<activity android:configChanges="orientation|screenSize|keyboardHidden" ...>
person rekire    schedule 24.03.2013
comment
спасибо за указание на класс приложения! Я обязательно посмотрю на это. Однако, когда я читал документы Android, я понял, что разработчик не может решать, когда действие останавливается и перезапускается. ОС Android принимает это решение за вас. - person Rene; 24.03.2013
comment
ну, первоначальный вопрос заключался в том, очистит ли перезапуск активности все за вас, или вам придется делать это самостоятельно. Но если ваш совет приведет к хорошему обходному пути, я сделаю ваш пост правильным ответом. Я должен сначала попробовать. - person Rene; 24.03.2013