Использование статических переменных в Android
В android используются статические переменные рекомендуемая практика?
Например, реализуя шаблон Singleton в Java, я обычно делаю:
private static A the_instance;
public static A getInstance() {
if (the_instance == null) {
the_instance = new A();
}
return the_instance;
}
Кроме того, когда это очищается Android JVM?
Спасибо.
Ответы
Ответ 1
Поля static
привязаны к экземпляру Class
в целом, который, в свою очередь, привязан к ClassLoader
, который загружал класс. the_instance
будет выгружен, когда будет восстановлен весь ClassLoader
. Я на 90% уверен, что это происходит, когда Android уничтожает приложение (а не когда он переходит в фоновый режим или приостанавливается, но полностью отключается.)
Итак, думайте об этом как о жизни, пока ваше приложение работает. Является ли Синглтон хорошей идеей? У людей разные взгляды. Я думаю, что это хорошо, если использовать его соответствующим образом. Я не думаю, что ответ сильно изменится на Android. Использование памяти не является проблемой сама по себе; если вам нужно загрузить кучу материала в памяти, это либо проблема, либо ее нет, независимо от того, инкапсулируете ли вы данные в Singleton.
Ответ 2
Я думаю, что статические переменные в порядке.
Это то, что говорит Android doc:
http://developer.android.com/guide/appendix/faq/framework.html
Как передавать данные между Activity/Services в одном приложении?
Открытое статическое поле/метод
Альтернативный способ сделать данные доступными для всех видов деятельности/служб - использовать общедоступные статические поля и/или методы. Вы можете получить доступ к этим статическим полям из любого другого класса вашего приложения. Чтобы совместно использовать объект, действие, которое создает ваш объект, устанавливает статическое поле, указывающее на этот объект, и любое другое действие, которое хочет использовать этот объект, просто обращается к этому статическому полю.
Ответ 3
Я не уверен, что такой подход хорош для мобильной платформы, где у вас ограниченная память. Не говоря уже о том, что приложение будет запускаться на устройстве с несколькими задачами.
Я думаю, этот подход может вызывать память из устройства, но у меня нет документа для поддержки этого. Возможно, кто-то, кто более образован, чем я, может поделиться своими мыслями.
Ответ 4
Нет. Не делай этого! Синглтон - это антипатер!. Вместо этого используйте инъекцию зависимостей, будь то через фреймворк (например, через Dagger или Roboguice) или явно передавая экземпляр объекта.