Событие EventBus для greenrobot в Android

Используя EventBus, мне нужно отправить событие (MyEvent) в Activity и получить событие в другой Activity на Android. Я пробовал проект тестирования производительности greenrobot EventBus, но не мог понять, как это сделать.

Я пробовал в ActivitySubscriber

MyEvent event = new MyEvent(); EventBus.getDefault().post(event); 

И попытался принять событие в ActivityReceiver как

 EventBus.getDefault().register(this); public void onEvent(MyEvent event){ .... } 

Но я не могу принять это событие. Может ли кто-нибудь сообщить мне, где я делаю неправильно?

    Поскольку они представляют собой два действия, ActivitySubscriber отправляет событие, пока ActivityReceiver все еще не создан или находится в режиме ожидания ( onStop() ). Вам нужно использовать липкие события, т. Е.

    • ActivitySubscriber.postSticky(...)

    А для ActivityReceiver у вас есть два варианта:

    • EventBus.getDefault().register(this) и где-то после этого EventBus.getDefault().getStickyEvent()
    • EventBus.getDefault().registerSticky() а затем с помощью обычного EventBus.getDefault().onEvent(...)

    Обновлено: EventBus 3.0 изменяет способ подписки.

    Нет необходимости в именах методов, которые заканчиваются определенными суффиксами, а скорее аннотациями.

    Как использовать версию 3:

     //// in your build.gradle compile 'de.greenrobot:eventbus:3.0.0-beta1' // alternatively you can target latest whatever currently // compile 'de.greenrobot:eventbus:+' //// from a class which needs to dispatch an event // posting an event is as before, no changes // here we dispatch a sticky event EventBus.getDefault().postSticky(myStickyEvent); //// from your class which needs to listen // method name can be any name // any of subscribe params is optional, ie can use just @Subscribe @Subscribe(threadMode = ThreadMode.MainThread, sticky = true, priority = 1) public void onEventBusEvent(@Nullable final StickyEvent stickyEvent) { if (stickyEvent != null) { ... // optionally you can clean your sticky event in different ways EventBus.getDefault().removeAllStickyEvents(); // EventBus.getDefault().removeStickyEvent(stickyEvent); // EventBus.getDefault().removeStickyEvent(StickyEvent.class); } } 

    Для получения дополнительной информации и сравнения версии 3:

    Некоторые данные из источников:

    • ThreadMode.PostThread

      Абонент будет вызываться в том же потоке, который отправляет событие. Это значение по умолчанию. Доставка событий подразумевает наименьшие издержки, поскольку она полностью исключает переключение потоков. Таким образом, это рекомендуемый режим для простых задач, которые, как известно, завершаются, очень короткий, не требуя основного потока. Обработчики событий, использующие этот режим, должны быстро возвращаться, чтобы не блокировать поток проводки, который может быть основным потоком.

    • ThreadMode.MainThread

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

    • ThreadMode.BackgroundThread

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

    • ThreadMode.Async

      Методы обработчика событий вызываются в отдельном потоке. Это всегда зависит от потока проводки и основного потока. События в проводке никогда не ждут методов обработчика событий, используя этот режим. Методы обработчика событий должны использовать этот режим, если их выполнение может занять некоторое время, например, для доступа к сети. Избегайте одновременного запуска большого количества длинных асинхронных методов обработчика, чтобы ограничить количество параллельных потоков. EventBus использует пул потоков для эффективного повторного использования потоков из завершенных асинхронных уведомлений обработчика событий.

    • Значения по умолчанию для @Subscribe
      • threadMode = ThreadMode.PostThread
      • sticky = false – если true, отправляет самое последнее липкое событие (отправлено с помощью de.greenrobot.event.EventBus.postSticky(Object) этому подписчику (если доступно событие)
      • priority = 0 – приоритет подписчика влияет на порядок доставки событий. В рамках одной и той же линии доставки абоненты с более высоким приоритетом получат события перед другими с более низким приоритетом. Приоритет по умолчанию – 0. Примечание: приоритет НЕ влияет на порядок доставки среди абонентов с различными режимами потоков.

    Изменить 2

    Сейчас есть выделенный сайт для любых вопросов GreenBot EventBus от создателя lib:

    http://greenrobot.org/eventbus/

    1. Добавить

    dependencies { .. compile 'org.greenrobot:eventbus:3.0.0' .. }

    В разделе зависимостей Модули Build gradle

    1. Создайте класс MessageEvent, например
     public final class MessageEvent { private MessageEvent() { throw new UnsupportedOperationException("This class is non-instantiable"); } public static class Message1{ public String str1; public Message1(String str) { str1 = str; } } public static class Message2{ public String str2; public Message2(final String str) { str2 = str; } } } // so on 

    Внутри класса ActivityReceiver замените

     EventBus.getDefault().register(this); 

    с

     EventBus.getDefault().register(this, MyEvent.class); 

    Это действительно зависит от того, когда и где этот код существует. Помните, что вы должны зарегистрироваться для событий, прежде чем сможете их получить, а регистрация выполняется во время выполнения, а не во время компиляции.

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

     EventBus.getDefault().register(this); 

    Прежде чем вы перейдете сюда:

     EventBus.getDefault().post(event);