Как внедрить шину событий Google guava в качестве глобального синглтона с помощью Roboguice в Android?

Как настроить Roboguice на использование одного и того же экземпляра шины событий при внедрении в мои действия и приемники широковещательных сообщений следующим образом:

@Inject EventBus eventBus;

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


person JohnRock    schedule 07.05.2014    source источник


Ответы (1)


final EventBus bus = new EventBus();

в вашем модуле и

bind(EventBus.class).toInstance(bus); // or an otherwise exposed singleton

в его методе configure должно помочь.

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

Не обязательно.

Все, что требуется, — это зарегистрировать активность (в качестве слушателя) в шине событий, принадлежащей приемнику широковещательной рассылки.

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

Или может быть одна шина событий на каждый широковещательный приемник, и даже несколько действий одновременно подписаны на события, которые он публикует.

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

person Konrad Morawski    schedule 07.05.2014
comment
Ваш ответ сработал для меня. Однако мне любопытно, как будет работать ваше предложение о нескольких шинах событий. Как действие будет подписываться на события из нескольких шин событий? Вы бы внедрили несколько шин событий в активность? Как приемник вещания укажет, какая шина событий должна быть внедрена? - person JohnRock; 07.05.2014
comment
@TheLizardKing да, я понимаю, что ты имеешь в виду. Вам нужно убедиться, что экземпляр EventBus используется совместно слушателем (или подписчиком) и афишей события (приемником широковещательной рассылки), так что, хотя нет глобального синглтона, вы все равно убедитесь, что ваш eventBus используется как минимум двумя объектами, в противном случае связи явно нет. Ну, вы можете использовать Provider для этого. Его можно вводить самому. Посмотрите этот ответ, например: stackoverflow.com/a/18358445/168719 - person Konrad Morawski; 08.05.2014