Поведение EventBus с жизненным циклом Activity/Fragment

Я зарегистрировал свою активность/фрагмент следующим образом:

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

У меня есть процесс, который работает и отправляет события со своим статусом в мой метод подписчика.

Например, если пользователь повернет устройство, будет вызван onStop, и моя активность/фрагмент будет отменена, и он не будет прослушивать события моего процесса, пока не зарегистрируется снова.

Если какие-то события будут опубликованы за это короткое время, что произойдет?

(учитывая, что моя шина событий не будет генерировать никаких исключений из-за отсутствия зарегистрированного подписчика.)

Я действительно хочу обрабатывать такие ситуации, когда по какой-то причине активность/фрагмент не зарегистрированы и некоторые события публикуются.

Я думал о реализации очереди событий, которые не получают подписчики, чтобы пользовательский интерфейс мог что-то с этим сделать, когда он снова зарегистрируется.


person Cícero Moura    schedule 19.09.2017    source источник


Ответы (2)


Вам нужно зарегистрироваться в onCreate() и отменить регистрацию в onDestroy(), примерно так:

@Override 
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ...
  // Check if Event Bus is not already register here
  if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().register(this);
     }
  ...
}

@Override 
protected void onDestroy() {
  // Check if Event Bus is register here, then unregister it.
  if (EventBus.getDefault().isRegistered(this)) {
      EventBus.getDefault().unregister(this);
     }
  super.onDestroy();
}
person ישו אוהב אותך    schedule 20.09.2017
comment
Можно ли «потерять» события после уничтожения и до повторного вызова onCreate? - person Cícero Moura; 20.09.2017

У вас есть два типа событий: - Те, которые сигнализируют о том, что что-то произошло, и не имеют большого значения позже. Например: скорость машины стала 50 км/ч - остальные больше похожи на штаты. Например, двигатель автомобиля выключен.

Если выложено событие первого типа, обычно не страшно пропустить, потому что будет другое, которое заменит старое значение (т.е. скорость стала 30 км/ч). Для второго типа событий вы, вероятно, захотите узнать последнее значение (или состояние), потому что оно может не измениться снова очень скоро. (в приведенном выше примере вы хотите знать, пропустили ли вы событие, когда двигатель был выключен или включен, чтобы сделать/показать что-то конкретное)

Этот второй тип событий обычно обрабатывается как фиксированный, для которого используются методы postSticky() и registerSticky(). Поэтому, если ваши события опубликованы как прикрепленные, после вызова registerSticky() вы получите уведомление обо всех закрепленных событиях с их последним значением.

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

person dragi    schedule 19.01.2018