Использование статических переменных в 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) или путем явной передачи экземпляра объекта.

Другие вопросы по тегам