Что это такое
Шина событий - отличное решение, позволяющее взаимодействовать объектам с разным жизненным циклом и расположенным на разных уровнях иерархии.
Рискну предположить, что если в вашем 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, не стесняйтесь обращаться к нам.