Подтвердить что ты не робот

Статическое время автономной работы в Android

У меня есть неясная ситуация:

Будут ли статические синглтоны собирать мусор после последнего контрольного холдинга? Активность была уничтожена? Поскольку в приложении для экземпляров Singleton больше нет ссылок. Могу ли я тогда опираться на одиночные игры?

Официальным Android doc:

Как правило, нет необходимости в подклассе Application. В большинстве случаев, статические синглеты могут обеспечивать такую ​​же функциональность в более модульной путь.

В какой-то пост:

https://web.archive.org/web/20160729201921/http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

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

Другими словами, если ничто не ссылается на мой статический одноэлементный класс, что бы предотвратить его сбор и уничтожение мусора?

4b9b3361

Ответ 1

Нет, потому что, если он является одиночным, он хранится как поле static в своем классе, и обычно одиночные игры не уничтожаются клиентами, т.е. вы не ставите статический метод deleteInstance(), который устанавливает ссылку на null, чтобы, если никто его не использует, он имеет право на сбор мусора. Для статических полей сбор мусора произойдет, когда загрузчик классов, загружающий класс, будет отброшен.

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

Ответ 2

Да. Каждый раз, когда вы покидаете приложение (например, ваше приложение открывает приложение для камеры, чтобы сделать снимок, или открывает браузер, чтобы открыть ссылку, или пользователь просто нажимает кнопку "Назад" ), существует вероятность, что ваш объект Application будет уничтожается и воссоздается при переходе к вашему приложению.

Вы должны инициализировать любую статическую переменную в блоке static {} в своем пользовательском классе Application, если она у вас есть, или в вашем Activities, чтобы убедиться, что они не будут пустыми.

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

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

EDIT:

Я знаю, что это было долгое время, и я полностью забыл об этой теме, так или иначе, вот источник официальной документации по жизненному циклу Android:

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

Ответ 3

Вы не можете контролировать, когда именно объекты Java становятся сборщиками мусора. Объект становится пригодным для сбора мусора, когда больше нет (некруглых) ссылок на него. С Android, кроме того, вы не можете контролировать, когда ваша активность будет удалена из памяти.

синглеты должны представлять что-то, что всегда существует.

  • Вы не можете заставить какой-либо объект собирать мусор; вы можете запросить, чтобы сборщик мусора работал с System.gc(), но это только запрос.

  • Если вы хотите сделать "singleton" подходящим для сбора мусора, вы, вероятно, захотите иметь метод для установки статической переменной в null (и надеемся, что ничто иное не взяло копию ссылки), Очевидно, что в следующий раз, когда кто-нибудь попросит экземпляр, его нужно будет воссоздать. в этот момент это не очень синглтон, конечно.

Ответ 4

Весь объект singleton останется, даже если активность будет уничтожена.