Использование статических переменных в Android - PullRequest
55 голосов
/ 19 марта 2010

В андроиде рекомендуется использовать статические переменные? Например, реализуя шаблон Singleton в Java, я обычно делаю:

private static A the_instance;
public static A getInstance() {
    if (the_instance == null) {
       the_instance = new A();
    }
    return the_instance;
}

Кроме того, когда это очищается JVM Android?

Спасибо.

Ответы [ 5 ]

62 голосов
/ 19 марта 2010
Поля

static присоединяются к экземпляру Class в целом, который, в свою очередь, присоединяется к ClassLoader, который загружал класс. the_instance будет выгружен, когда весь ClassLoader будет восстановлен. Я на 90% уверен, что это происходит, когда Android уничтожает приложение (не когда оно уходит в фоновый режим или приостанавливается, но полностью выключается).

Итак, думайте о том, что вы живете, пока работает ваше приложение. Синглтон хорошая идея? У людей разные взгляды. Я думаю, что это нормально, когда используется соответствующим образом, сам. Я не думаю, что ответ сильно меняется на Android. Использование памяти не является проблемой само по себе; если вам нужно загрузить кучу вещей в память, это либо проблема, либо нет, независимо от того, инкапсулированы ли вы данные в Singleton.

15 голосов
/ 04 сентября 2010

Я думаю, что статические переменные в порядке.

Это то, что говорит Android док:

http://developer.android.com/guide/appendix/faq/framework.html

Как передать данные между действиями / службами в рамках одного приложения?

Открытое статическое поле / метод

Альтернативный способ сделать данные доступными через деятельность / службы - это использование открытых статических полей и / или методов. Вы можете получить доступ к этим статическим полям из любого другого класса в вашем приложении. Для совместного использования объекта действие, которое создает ваш объект, устанавливает статическое поле для указания на этот объект, а любое другое действие, которое хочет использовать этот объект, просто обращается к этому статическому полю.

0 голосов
/ 23 марта 2019

Вопреки тому, что говорят другие люди - это более чем нормально. Конечно, это имеет некоторую структуру. В официальном репозитории googlesamples / android-Architecture он используется под todo-mvp-clean (приложение Todo, реализующее шаблон MVP и следующее принципам чистой архитектуры). Проверьте этот файл .

То, что вы видите, это множество статических методов, ссылающихся на одноэлементные геттеры.

Современной, менее подверженной ошибкам и удобной альтернативой является структура Dagger DI.

0 голосов
/ 19 марта 2010

Нет. Не делай этого! Синглтон - это антипаттерн! . Вместо этого используйте внедрение зависимостей, будь то через каркас (например, через Dagger или Roboguice ) или путем явной передачи экземпляра объекта.

0 голосов
/ 19 марта 2010

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

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

...