Как обрабатывать события отправленные EventBus-ом когда UI компонент Android находится на паузе?

Здравствуйте,

Я несколько недель подряд нахожусь в погоне за идеальный архитектурой для android приложения.

Очень понравились следующие статьи:
www.mdswanson.com/blog/2014/04/07/durable-android-...
www.birbit.com/a-recipe-for-writing-responsive-res...

Как видите, в обоих постах взаимодействие и связь между компонентами android осуществляется с помощью Event Bus. (в одном случае EventBus от greendao, в другом Otto от square) . Единственным минусом обоих постов я считаю что нигде ни слово не сказано о том, как обрабатывать события которые были отосланы к Activity или Fragment, когда последние находились в состояние паузы.

Т.к. event bus необходимо отвязывать от ui компонентов в методе onPause(), получается что мы теряем event который им был отослан.

Не подскажите, каким будет наиболее прямолинейное и красивое решение этой проблемы?
  • Вопрос задан
  • 8796 просмотров
Пригласить эксперта
Ответы на вопрос 4
@gurinderu
java developer
Попробуйте накапливать events в какую-то коллекцию, к примеру linledlist или лучше queue(естественно concurent), когда приходят ивенты в бекграунде и во время onResume прогоните их по порядку. Однако если ивенты взаимосвязаны будет ахтунг. В общем это не такая простая задача. Можно попробовать опрашивать состояния сервиса на onResume и вообще без ивентов обоитись.
Ответ написан
DrZ0idberg
@DrZ0idberg
Android-разработчик. Стаж - возраст Android.
Sticky events должны помочь. EventBus хранит последний отправленный экземпляр sticky событий. Соответственно при старте активити/фрагмента можно запросить это событие и обработать.
Но так как хранится только последнее событие, получить целую последовательность пропущенных событий не удастся (если только они не разных типов и не были отправлены все как sticky). Вообще, если возникла такая необходимость, наверное стоит пересмотреть архитектуру приложения. EventBus не панацея - вполне может плохо подходить для каких-то задач...
P.S.: в своих проектах использую EventBus от greenrobot, так что всё вышесказанное относится к этой реализации.
Ответ написан
@StanKo
А если не отвязывать EventBus в onPause(), а только уже в onDestroy()? Да, активити будет на паузе и не отобразит реакции интерфейсно, но отловить и обработать все равно можно будет, да хоть бы и в коллекцию событий закинуть.
PS Google сам заявляет что не стоит использовать их реализацию EventBus (которая в Guavа), поэтому лучше использовать greenrobot-овскую.
Ответ написан
@Dmtm
Android
нужен слой данных, независимый от UI,
UI берет данные только в data layer
EventBus рассылает только уведомления об изменении в данных, но не сами данные
т.е. если активность живая, то она берет значения в data layer по умолчанию, если во время жизни приходит уведомление, то обновляется из data layer,
если же активность перезапустилась, то уведомление конечно пропало, но данные все равно берутся из data layer
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы