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

Использование статических переменных в 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?

Спасибо.

4b9b3361

Ответ 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) или явно передавая экземпляр объекта.