Шина событий не получена

#android #event-bus #otto

#Android #шина событий #otto

Вопрос:

Я пытаюсь передать событие с помощью шины событий Otto из SplashActivity в LoginActivity, что через 2 или 3 действия с:

SplashActivity

 @Override
    public void onStart() {
        super.onStart();
        BusProvider.getInstance().register(this);

        if(UtilityManager.isAppOpenedFromNotificationTap(this)){
            BusProvider.getInstance().post(new AppOpenedFromNotificationClickEvent());
        }
        
    }

    @Override
    public void onStop() {
        super.onStop();
        BusProvider.getInstance().unregister(this);
    }
  

И я получаю значение с:

LoginActivity

 @Override
    public void onStart() {
        super.onStart();
        BusProvider.getInstance().register(this);

    }

    @Override
    public void onStop() {
        super.onStop();
        BusProvider.getInstance().unregister(this);
    }

@Subscribe
    public void onAppOpenedFromNotificationEvent(AppOpenedFromNotificationClickEvent event) {
        Log.e("LOGIN", "ARRIVED" );
        appOpenedFromNotification = true;
    }
  

Этот журнал, который я помещаю в subscribe, никогда не показывается. В чем проблема?

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

1. Возможно ли, что LoginActivity не был создан (и запущен), когда SplashActivity отправляет событие; в этом случае LoginActivity еще не зарегистрирован и, следовательно, никогда не получает событие.

2. Вероятно, мне нужно переосмыслить поток.

3. В случае, если вы хотите обработать событие позже или быть готовым к получению, когда компонент будет готов в вашем случае для входа в систему, вы можете создать липкое событие, которого должно быть достаточно greenrobot.org/eventbus/documentation/configuration /…

Ответ №1:

Используйте липкое событие

для отправки

 EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
  

для получения

 // UI updates must run on MainThread
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {   
    textField.setText(event.message);
}