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

Я зарегистрировал свою деятельность / фрагмент, как это:

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

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

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

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

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

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

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

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

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();
}

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

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

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

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

Другие вопросы по тегам