Eventbus: удалить липкое событие после потребления

#android #greenrobot-eventbus

#Android #greenrobot-eventbus

Вопрос:

Я использую firebase для отправки уведомлений. Когда приложение находится на переднем плане, уведомление получает класс, который расширяется FirebaseMessagingService . Итак onMessageReceived , я делаю это:

EventBus.getDefault().postSticky(new NotificationEvent(body, title, url));

У меня есть два действия, которые прослушивают это событие. Действие A и действие B.

В обоих действиях я делаю это:

 @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void consumeNotification(NotificationEvent event) {
        //Consume event
    }

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
        Log.d(TAG, "onStart called");
    }

    @Override
    public void onStop() {
        NotificationEvent event = EventBus.getDefault().getStickyEvent(NotificationEvent.class);
        if (event != null) {
            EventBus.getDefault().removeStickyEvent(event);
        }
        EventBus.getDefault().unregister(this);
        super.onStop();
        Log.d(TAG, "onStop called");
    }
  

Теперь в действии A есть кнопка, которая запускает действие B.

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

Поэтому, когда я нажимаю кнопку для запуска действия B ( onStop вызывается для действия A), но, к удивлению, событие снова принимается в действии B, когда оно должно было быть удалено при onStop вызове в действии A.

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

Но когда я нажал физическую кнопку «Назад», чтобы вернуться к действию A, событие снова принимается в действии A, когда оно должно было быть удалено.

Пожалуйста, что должно быть причиной этого и как это можно исправить?

ПРИМЕЧАНИЕ: я решил использовать событие stick, потому что, если я использую событие non-sticky, событие не доставляется, когда экран считается выключенным для любого из действий.

Комментарии:

1. Вы пытались удалить его onPause() вместо onDestroy() ?

2. Привет, эта проблема решена?

Ответ №1:

Похоже, вам нужно было позвонить EventBus.getDefault().removeStickyEvent(event); внутрь consumeNotification(NotificationEvent event) и оставить EventBus.getDefault().unregister(this); в onStop()