Dev Notes

Otto

July 29, 2016

Очередная библиотека от Square для удобного взаимодействия между компонентами приложения, разработанная специально для Android платформы. Реализует паттерн Publish–subscribe. Android сообщество не рекомендует использовать Event Bus, так как данное решение довольно противоречиво и напоминает небезызвестную конструкцию go to. Если же вы все же решили воспользоваться такой возможностью, то рассмотрим базовую настройку Otto: Подключаем зависимости в build.gradle

dependencies {
   compile 'com.squareup:otto:1.3.8'
 }

По умолчанию Otto работает в UiThread и выбрасывает исключение IllegalStateException("Event bus accessed from non-main thread"). Если требуется использовать event-ы в многопоточной среде, в конструктор добавьте ThreadEnforcer.ANY

// в случае singleton
Bus otto = new Bus();

// в случае, когда требуются несколько объектов
Bus otto = new Bus("id_event_bus");

// в случае, когда требуются multithread event-ы
Bus otto = new Bus(ThreadEnforcer.ANY);

// в случае, когда требуются разные объекты для multithread event-ов
Bus otto = new Bus(ThreadEnforcer.ANY, "id_event_bus");

Разработчики рекомендуют использовать singleton реализацию, либо инъектить с помощью DI (например Dagger 2). Для того, чтобы послать event, пишем следующий код:

otto.post("Какой то event");

Для того, чтобы принять данный event, необходимо зарегистрироваться для приема event-ов:

otto.register(this);

Раз есть возможность подписаться, то должна быть и отписка. Старайтесь не забывать об этом, чтобы не было неожиданных event-ов:

otto.unregister(this);

Для обработки event-а вешаем аннотацию @Subscribe на тело метода и в качестве параметра метода указываем переменную с необходимым типом:

@Subscribe public final void onStringEvent(String message) {
  Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}

Если в вашем проекте используется proguard (если же нет, то стоит задуматься об этом), добавьте в proguard-project.txt:

-keepattributes *Annotation*
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}

Полный код примера всегда можно найти на GitHub данной библиотеки


Alexey Sadykov

Written by Alex - android developer,
react-native learning, PS4 gamer, music lover.