Что это такое

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

Рискну предположить, что если в вашем Android-приложении есть шина событий, то, скорее всего, вы используете библиотеки типа Otto или EventBus.

Однако Otto from Square официально устарел, и на его странице на GitHub написано: «Этот проект устарел в пользу RxJava и RxAndroid».

Поскольку мы уже используем RxJava и RxAndroid в разработке, мы решили опробовать подход Rx к реализации шины событий. Конечно, мы сделали все возможное, чтобы сохранить чистый api, управляемый аннотациями и простой в использовании библиотекой шины, такой как Otto.

Так была создана библиотека RxBus. Эта библиотека доступна на GitHub.

Советы по использованию

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

Bus bus = BusProvider.getInstance();

По умолчанию шина обеспечивает, чтобы все взаимодействия происходили в основном потоке. Чтобы подписаться на событие, вы можете объявить метод и аннотировать его с помощью @Subscribe. Метод должен быть общедоступным и принимать только один параметр.

@Subscribe
public void onEvent(SomeEvent event) {
    // TODO: Do something
}

Вы также можете добавить фильтр и альтернативное применение, создав подписку со следующим:

CustomSubscriber<SomeEvent> customSubscriber = bus.obtainSubscriber(SomeEvent.class,
    new Consumer<SomeEvent>() {
        @Override
        public void accept(SomeEvent someEvent) throws Exception {
            // TODO: Do something
        }
    })
    .withFilter(new Predicate<SomeEvent>() {
        @Override
        public boolean test(SomeEvent someEvent) throws Exception {
            return "Specific message".equals(someEvent.message);
        }
    })
    .withScheduler(Schedulers.trampoline());

Чтобы получать события, экземпляр класса должен зарегистрироваться на шине:

bus.register(this);

Пользовательскому подписчику также необходимо зарегистрироваться в шине:

bus.registerSubscriber(this, customSubscriber);

При необходимости вам также потребуется вызвать метод unregister:

bus.unregister(this);

Чтобы опубликовать новое событие, вы можете вызвать метод post:

bus.post(new SomeEvent("Message"));

Чтобы добавить RxBus в свой проект (как зависимость Gradle), используйте:

compile 'com.github.anadea:rxbus:1.0.1'

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