Статические поля в Android

Я новичок в разработке android и java, и я хочу понять некоторые вещи.

  1. это плохая практика использовать статическое поле для передачи данных между деятельность и фрагменты? Для меня это намного проще, чем использовать кроме намерения.

  2. почему многие программы используют контекст в качестве параметра в конструкторах и методах, когда мы можно ли использовать статическое поле для доступа к одной точке для контекста приложения? Для пример:

    public class ApplicationLoader extends Application {
    public static volatile Context context;
        @Override
        public void onCreate() {
            super.onCreate();
            context = getApplicationContext();
        }
    }
    

Так может кто-нибудь объяснить, в каких случаях следует использовать статические поля в android (я имею в виду для таких классов, как адаптеры, списки, контекст и т. д.)? И при использовании нестатических полей, геттеров / сеттеров, extra in intents лучше, чем статические поля?

3 ответов


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

вообще говоря, да. Конечно, существуют шаблоны Android для использования статических членов данных, но для "передачи данных" они редко используются по всем классическим причинам, почему глобальные переменные считаются плохой формой в большинстве языков программирования.

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

для меня это намного проще, чем использовать экстры в намерениях.

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

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

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

среди других причин, часто это неправильно Context использовать. Используйте только Application экземпляр, когда вы знаете точно почему С помощью Application инстанции является правильным Context на это обстоятельство. Например, создание UIs из Application (например, via LayoutInflater) часто дает неправильные результаты.

этот эпический блоге Дэйв Смит помогает наметить роли различных типов Context.

в каких случаях следует использовать статические поля в Android

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

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

предполагая, что под "списками" вы подразумеваете ListView, использование статических членов данных не подходит для любого из этих случаев, IMHO.


  1. это плохая практика...

да. Activity и Fragment нестационарные объекты. Они приходят и уходят по требованию. В случае Activity, Он создается автоматически платформой при необходимости. Ваше приложение может иметь несколько экземпляров одного и того же Activity класс создается одновременно, в зависимости от того, как вы разработали свое приложение и состояние стека задач/back пользователя. В этих случаях static отслеживание одного Context будет ломать вещи в приложении.

  1. почему многие программы используют контекст...

это из-за характера объекты созданы равными. The Context вернулся из getApplicationContext() является синглтоном для вашего приложения; но, каждый Activity и Service экземпляр-отдельный экземпляр Context и является временным (см. выше). За многие объяснение, см. эту большую статью от Дэйва Смита:http://possiblemobile.com/2013/06/context/


@google,

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

    1. потому что контекст является "базовым классом" активности

и очень важно прочитать эту полезное руководство для пользы статического и геттер/сеттер.

Если какая-либо проблема, дайте мне знать.