Как получить событие в сервисе Intent (шина событий Greenrobots)
Я пытаюсь получить липкое событие в IntentService
, Я пытался поймать события в onEvent()
а также onEventBackgroundThread()
но я не получаю события. Я знаю, как отправлять и получать события между действиями и фрагментами, которые не могут заставить отправлять события в службу для работы. Eventbus отправляет сообщение в сервис? Если это так, где подписаться на события? Я пытался подписаться в onHandleIntent(Intent intent)
и в конструкторе службы. Неудачно. Может кто-нибудь, пожалуйста, помогите?
2 ответа
Сервисы и EventBus на самом деле не смешиваются. Служба IntentService предназначена для того, чтобы что-то делать в фоновом потоке - запустить и забыть. Службы могут работать в разных процессах и использовать разные контексты. То, как они общаются, очень запатентовано и плохо поддается внешним фреймворкам, таким как EventBus.
Мой совет заключается в том, чтобы пересмотреть необходимость использования IntentService и рассмотреть возможность использования http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/ различных методов доставки, поэтому опубликуйте событие из вашего пользовательского интерфейса для менеджера в вашем слое связи, который получит его в фоновом потоке, обработает и, в свою очередь, опубликует другое событие с результатами, которые пользовательский интерфейс будет прослушивать в основном потоке.
Итак, ваш менеджер выглядит примерно так:
@Subscribe(threadMode = ThreadMode.BackgroundThread)
public void onEvent(AccountsDoGetEvent event){
//do long running task like going to network or database
EventBus.getDefault().post(new AccountsUpdatedEvent);
}
и ваш фрагмент выглядит примерно так:
@Subscribe(threadMode = ThreadMode.MainThread)
public void onEvent(AccountsUpdatedEvent event){
//update the UI
}
public void onButtonClicked(){
EventBus.getDefault().post(new AccountsDoGetEvent());
}
Вам нужно зарегистрировать свой сервис с помощью 'registerSticky', чтобы перехватывать липкие события