Android: с Greenrobot EventBus, как общаться между двумя действиями?

Я хотел бы общаться между 2 Activity. Оба являются методами register() и unregister():

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

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

ActivityB запускается, когда я нажимаю в своем списке (выбор элемента). Целью ActivityB является обновление некоторой информации и отправка этой новой информации в ActivityA; поэтому в ActivityB я звоню:

EventBus.getDefault().post(new MyNewEvent(bla bla bla));

В моем ActivityA у меня есть этот метод:

public void onEvent(MyNewEvent event) {
    ...
}

К сожалению, этот метод onEvent никогда не вызывается. Почему ? Потому что, когда ActivityB запускается, вызывается метод onStop() в ActivityA, поэтому отмена регистрации на шине выполняется...

Итак, как в этом случае общаться между этими двумя действиями с помощью EventBus?

Спасибо вам, ребята!


person anthony    schedule 04.09.2015    source источник


Ответы (2)


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

Шаблон startActivityForResult гораздо лучше подходит для того, чего вы пытаетесь достичь: http://developer.android.com/reference/android/app/Activity.html#StartingActivities

person jlhonora    schedule 04.09.2015
comment
Спасибо за ваше объяснение. Таким образом, шина событий на самом деле не лучший выбор для связи между компонентами Android. - person anthony; 04.09.2015
comment
Это зависит. Мне очень нравится, когда у меня много некритических событий или при общении с фоновыми/асинхронными задачами. Но при интерактивном общении лучше всего использовать намерение/результаты. - person jlhonora; 04.09.2015
comment
Если мы не можем использовать EventBus для связи между действиями, то напишите свой простой EventController только для обработки событий во всех действиях, фрагментах. Нет необходимости использовать EventBus вообще. Создайте класс EventController. Используйте CopyOnWriteArrayList для хранения ссылок EventListener. И просто реализуйте интерфейс EventListener во всех действиях. Интерфейс EventListener будет содержать единственный метод с именем handleEvent(). - person Anish Mittal; 24.09.2016