2010-03-19 2 views
54

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

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

Кроме того, когда же это очищается вверх Андроид JVM?

спасибо.

+0

Я считаю, что вам понадобится блокировка для синхронизации для вашего одноэлементного класса, иначе вы будете иметь несколько объектов в кучевой памяти в многопоточном сценарии. – shanwu

ответ

61

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

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

+4

Подтверждено, оно будет сохранено до тех пор, пока весь ваш процесс не будет уничтожен. Когда ваш процесс будет восстановлен, ваш синглтон появится снова! –

+13

Следует отметить, что синглтон будет воссоздан, но исходное состояние синглтона не восстанавливается автоматически. Это нужно сделать вручную. –

+0

@Kevin Вы можете уточнить свой комментарий? –

0

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

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

+0

Я не думаю, что это может быть проблемой, поскольку DVM хорошо управляет ее памятью. –

-4

Нет. Не делайте этого! Singleton is an anti-patern!. Вместо этого используйте инъекцию зависимостей, будь то через фреймворк (например, через Dagger или Roboguice) или путем явной передачи объекта-объекта.

+36

Имейте в виду, что основная команда Android защищает использование вашего «анти-шаблона», и Google Guice, похоже, требует около 800 КБ JAR, что плохо для мобильного приложения. – CommonsWare

+5

Guice замечательный, но это может быть слишком много для многих приложений. Но если вы собираетесь погрузиться в Guice, взгляните на этот прекрасный проект: http://code.google.com/p/roboguice/ –

+3

Зависимость от инъекций приводит к сложности. Я видел, как некоторые разработчики тратили часы, выясняя, почему были введены неправильные объекты. Синглтон имеет свои ценности! – yonexbat

15

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

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

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

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

Публичный статическое поле/метод

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

+8

Связывание, обратные вызовы/прослушиватели, но не статические –

+1

Вы слышали о намерениях? статические поля - плохая практика, она имеет тенденцию к плотной паре ... – AnixPasBesoin

+1

Можете ли вы, ребята, предоставить мне правильное решение? Со статическими переменными я столкнулся с проблемой, когда приложение приходит из фона или остается открытым в течение многих часов, оно сбой. С намерением очень сложно передать объекты. Итак, каков правильный способ сделать это? –

Смежные вопросы