Как запретить EventBus доставлять событие в неправильное действие

Предположим, что в нашем приложении есть 3 действия: A, B и C. И только A зарегистрирован в EventBus по адресу onStart() и не зарегистрирован по адресу onStop(), как объяснено здесь, и у него есть метод обработчика событий: onEvent(X event){...}, который направляет пользователя на C после получения события X.

Но см. ниже несчастный сценарий:

  1. Пользователь запускает А.
  2. Пользователь запускает фоновую операцию на A.
  3. Пользователь переходит к B, нажав кнопку на A, не дожидаясь завершения фоновой операции. A будет отменена регистрация в EventBus.
  4. Пользователь возвращается к A. A снова будет зарегистрирован в EventBus.
  5. Фоновая операция, которая была запрошена до того, как пользователь перешел к B, завершена, событие X запускается из фона.
  6. Событие X доставляется в A, и обработчик событий (onEvent(X event){...}) немедленно направляет пользователя к действию C.

Это странный пользовательский опыт, как мы можем избежать доставки события в A, когда оно будет снова зарегистрировано?

Одним из решений является отмена текущих фоновых операций в onStop(), чтобы событие никогда не запускалось; однако отмена фоновой операции не всегда возможна.

Я использую EventBus GreenRobot.


person atakan    schedule 27.01.2016    source источник


Ответы (2)


вы можете использовать счетчик для вашего Bus

например, иметь поле static int в своей деятельности и увеличивать его каждый раз, когда вы регистрируете Bus для этой деятельности, и при инициализации фоновой задачи передайте этот счетчик своей задаче и отправьте его обратно после ее завершения. затем в обработчике событий проверьте это значение с текущим значением вашего счетчика, и если они не совпадают, ничего не делайте.

person Mohammad Rahchamani    schedule 27.01.2016

Я не уверен, каково здесь ожидаемое поведение, что должно делать приложение, когда пользователь находится в точке A и фоновая задача завершена? игнорировать событие?

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

person Joan S.    schedule 27.01.2016
comment
Что ж, в этом случае либо отмените регистрацию EventBus в действии A (если вам там не нужны никакие другие события), либо используйте определенный класс событий, который обработчик событий в действии A не ожидает (onEvent()). - person Joan S.; 27.01.2016