Greenbot Eventbus 3.0: в чем разница между onEvent, onEventMainThread, onEventBackgroundThread и onEventAsync?

Я немного запутался с использованием onEvent, onEventMainThread, onEventBackgroundThread а также onEventAsync в EventBus 3.0 Greenrobot

Из того, что я вижу в документации:

  • onEvent используется с ThreadMode.POSTING (дефолт)
  • onEventMainThread используется с ThreadMode.MAIN
  • onEventBackgroundThread используется с ThreadMode.BackgroundThread
  • onEventAsync используется с ThreadMode.ASYNC

Но в случае, когда событие публикуется из фонового потока:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MyEvent event) {
    // some UI manipulation
}

Имеет точно такое же поведение как:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MyEvent event) {
    // some UI manipulation
}

А также:

@Subscribe
public void onEventMainThread(MyEvent event) {
    // some UI manipulation
}

Броски CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. потому что нить такая же, как нить публикации (фоновая нить в моих тестах).

Начиная с версии 3.0, @Subscribe требуется аннотация, поэтому я не понимаю, в каком случае мне следует использовать методы, отличные от onEvent, Поддерживали ли они обновление с EventBus 2 до 3?

2 ответа

Решение

Я нашел ответ, в отличие от EventBus 2, имя метода не важно, так как в EventBus 3 аннотации используются в пользу Reflection, поэтому будет работать следующее:

@Subscribe(threadMode = ThreadMode.MAIN)
public void someMethodName(MyEvent event) {
    // some UI manipulation
}

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

@Subscribe это аннотация, которая регистрирует метод с помощью EventBus, в прошлом это делалось с помощью отражения, поэтому вам приходилось называть методы определенным образом (onEvent, onEventMainThread так далее). Это имело два недостатка:

  1. Отражение довольно медленно в Java, и
  2. Соглашение об именах не является интуитивно понятным для новых пользователей.

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

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