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