Вступление
RoboGuice , также называемый Google Guice для Android, — это простая в использовании инфраструктура внедрения зависимостей, которая может сделать разработку Android более интуитивно понятной и удобной. Используя эту платформу, вы можете значительно сократить объем кода, который вы пишете для выполнения общих задач, таких как инициализация различных ресурсов, доступ к системным службам Android и обработка событий.
В этом уроке я покажу вам, как максимально использовать RoboGuice 3 в ваших проектах Android.
1. Понимание внедрения зависимости
Традиционно, если объект зависит от чего-либо, он несет ответственность за удовлетворение этой зависимости. Проще говоря, если экземпляр класса A зависит от экземпляра класса B, то обычно ожидается, что разработчик вызовет конструктор класса B внутри кода класса A. Это, очевидно, приводит к более тесной связи между этими двумя классами.
Внедрение зависимостей — это шаблон проектирования, в котором объекты полагаются на внешний код, который обычно называется инжектором зависимостей, для удовлетворения своих зависимостей. Это означает, что если объект зависит от других объектов, ему не нужно знать, как создавать или инициализировать эти объекты. Это уменьшает связь между объектами и приводит к тому, что код становится более модульным, более простым для изменения и менее сложным для тестирования.
Таким образом, используя внедрение зависимостей, вы можете в значительной степени избавиться от конструкторов и фабричных методов в бизнес-логике вашего проекта.
2. Как работает RoboGuice
Google Guice — это инфраструктура, которая упрощает создание, настройку и использование инжектора зависимостей в ваших проектах Java. RoboGuice основан на Google Guice и поставляется с предварительно настроенным инжектором зависимостей для Android. Проще говоря, RoboGuice из коробки знает, как инициализировать различные объекты Android, получать ссылки на различные ресурсы приложения и многое другое.
RoboGuice использует аннотации Java, которые представляют собой не что иное, как метаданные, встроенные в код Java, для определения того, что и куда нужно вводить Более ранние версии RoboGuice использовались для обработки аннотаций с использованием Java Reflection API во время выполнения и часто критиковались за медлительность. RoboGuice 3, однако, поставляется с RoboBlender, процессором аннотаций во время компиляции, который значительно улучшает производительность RoboGuice.
3. Настройка RoboGuice
Прежде чем использовать RoboGuice, вы должны добавить его в качестве зависимости compile
в файл build.gradle модуля приложения . Поскольку он доступен в стандартном репозитории Android Studio, jcenter , для этого требуется всего одна строка кода.
groovy compile 'org.roboguice:roboguice:3.0.1'
Для повышения производительности RoboGuice рекомендуется также добавить RoboBlender , процессор аннотаций, в качестве provided
зависимости.
groovy provided 'org.roboguice:roboblender:3.0.1'
Чтобы использовать аннотации RoboGuice в ваших действиях на Android, их классы должны расширять RoboActivity
вместо Activity
. Точно так же, если вы хотите использовать аннотации внутри службы Android, ее класс должен расширять RoboService
вместо Service
.
4. Связывание макетов с деятельностью
Обычно вы должны использовать метод setContentView
и передавать ему ресурс макета, чтобы установить макет Activity
. RoboGuice предлагает альтернативный способ сделать то же самое, аннотацию @ContentView
.
Например, вот как вы должны применить макет, определенный в файле XML с именем activity_main.xml, к RoboActivity
именем MainActivity :
« `java @ContentView (R.layout.activity_main) открытый класс MainActivity расширяет RoboActivity {
} « `
5. Внедрение взглядов
Если вы считаете, что использование метода findViewById
и приведение типов к типу объекта View
он возвращает, — большая работа, вы можете вместо этого @InjectView
аннотацию @InjectView @InjectView
.
Например, рассмотрим следующий макет:
« `XML
« `
Чтобы инициализировать два виджета пользовательского интерфейса, определенных в XML, в RoboActivity
, вы можете написать следующее:
« `java @InjectView (R.id.email) частная электронная почта TextView;
@InjectView (R.id.okay) приватная кнопка в порядке; « `
6. Внедрение ресурсов
Доступ к ресурсам вашего приложения с помощью Android API включает в себя множество различных классов и функций. Например, чтобы получить Drawable
, вы должны будете использовать ContextCompat.getDrawable
. Чтобы получить Animation
, вы должны будете использовать AnimationUtils.loadAnimation
.
Аннотация @InjectResource от @InjectResource
предлагает более согласованный способ извлечения всех типов ресурсов. В следующем фрагменте кода показано, как внедрить ColorStateList
, Drawable
, String
и Animation
:
« `java @InjectResource (R.color.red) private ColorStateList red;
@InjectResource (R.drawable.square) private Drawable square;
@InjectResource (R.string.hello) private String hello;
@InjectResource (R.anim.fade) private Animation fade; « `
7. Внедрение системных услуг
Чтобы получить ссылку на системную службу Android, такую как PowerManager
или Vibrator
, вы можете использовать аннотацию @Inject
вместо использования метода getSystemService
. Например, вот как вы можете получить ссылку на PowerManager
:
java @Inject private PowerManager pm;
8. Впрыскивание дополнений
Вы можете использовать аннотацию @InjectExtra
для @InjectExtra
дополнительных данных, которые были переданы в RoboActivity
. Следующий фрагмент кода добавляет дополнительный ключ с ключом EMAIL_ADDRESS :
java @InjectExtra("EMAIL_ADDRESS") private String email;
Обратите внимание, что @InjectExtra
вызовет ошибку во время выполнения, если лишняя отсутствует. Если extra является необязательным, вы должны включить optional
флаг, значение которого установлено в true
, чтобы избежать ошибки.
java @InjectExtra(value = "EMAIL_ADDRESS", optional = true) String email;
9. Внедрение ваших собственных классов
До сих пор мы вводили элементы, относящиеся к Android SDK. Чтобы добавить свои собственные классы, вы должны использовать аннотацию @Inject
. @Inject
ведет себя во многом как new
ключевое слово Java, и вам не нужно вносить какие-либо изменения в класс, чтобы сделать его инъекционным, если у него есть конструктор по умолчанию. Например, рассмотрим следующий класс:
java public class Employee { public Employee() { Log.d("RG", "Hello"); } }
Чтобы внедрить экземпляр класса Employee
, вы должны использовать следующий код:
java @Inject Employee p; // equivalent to new Employee()
10. Использование пользовательских провайдеров
Если вы хотите лучше контролировать то, что вводится при использовании @Inject
, вам нужно создать своих собственных провайдеров.
Давайте создадим простой поставщик, который возвращает случайное число каждый раз, когда @Inject
используется для инициализации целого числа.
Шаг 1: Создать провайдера
Провайдер — это просто класс, который реализует интерфейс Provider
. Поэтому создайте новый класс MyRandomNumberProvider, который реализует Provider
и переопределите его метод get
.
« `Открытый класс Java MyRandomNumberProvider реализует поставщик
@Override public Integer get () { }} `` `
Как вы уже догадались, возвращаемое значение метода get
— это то, что будет введено при использовании @Inject
. Чтобы вернуть случайное целое число, добавьте следующий код в метод get
:
java // Returns a random integer between 0 and 999 return (int)(Math.random()*1000);
Шаг 2: Создайте модуль
Чтобы иметь возможность использовать свой пользовательский провайдер, вам нужно создать модуль для него. Модуль — это класс, который расширяет класс AbstractModule
. Внутри модуля вы переопределяете метод configure
и указываете, к какому классу должен быть привязан поставщик, используя методы bind
и toProvider
.
Чтобы создать модуль для MyRandomNumberProvider
, создайте новый класс Java с именем MyRandomNumberModule и добавьте в него следующий код:
« `открытый класс Java MyRandomNumberModule extends AbstractModule {
@Override public void configure () { // Привязать целое число к MyRandomNumberProvider связывания (Integer.class) .toProvider (MyRandomNumberProvider.class); }} `` `
Шаг 3: зарегистрируйте модуль
Чтобы RoboGuice узнал о вашем модуле, вы должны зарегистрировать его в AndroidManifest.xml вашего приложения, используя тег meta-data
. Атрибут имени тега должен быть установлен как roboguice.modules, а его атрибут value
должен содержать имя класса модуля.
« `XML
« `
Поставщик теперь готов. На этом этапе, если вы аннотируете Integer
с помощью @Inject
, он будет инициализирован случайным числом.
« `java @Inject Integer random1; // Инициализирован случайным числом
@Inject Integer random2; // Инициализирован на другое случайное число « `
11. Работа с синглетонами
Если вы разработчик, который предпочитает использовать одно приложение для обмена данными между несколькими действиями и службами, вы можете использовать аннотации @Singleton
и @Inject
чтобы упростить ваш код.
Добавив аннотацию @Singleton
к классу, вы можете сообщить RoboGuice, что он не должен создавать более одного экземпляра класса. Следующий код создает синглтон с именем MySingleton :
java @Singleton class MySingleton { }
Теперь вы можете использовать аннотацию @Inject
для @Inject
синглтона в ваши классы. Например, вот как вы MySingleton
:
java @Inject MySingleton singleton;
12. Наблюдение за событиями
Используя аннотацию @Observes
, вы можете наблюдать различные события, связанные с Activity
. Это означает, что вам не нужно переопределять onCreate
, onResume
и другие методы жизненного цикла класса Activity
.
В следующем коде показано, как аннотация @Observes
может использоваться в качестве альтернативы переопределению методов onCreate
и onDestroy
:
« `открытый класс Java MainActivity расширяет RoboActivity {
// Вызывается при создании действия public void initialize (@Observed OnCreateEvent e) { // Код инициализации идет сюда } // Вызывается, когда действие уничтожено публичная очистка void (@Observed OnDestroyEvent e) { // Очистка кода идет здесь }} `` `
Вывод
Из этого руководства вы узнали, как использовать RoboGuice, чтобы сделать ваш код более лаконичным и читабельным. При этом вы также узнали, как использовать аннотации Java и шаблон внедрения зависимостей.
Чтобы узнать больше о RoboGuice, я рекомендую просмотреть его вики на GitHub.