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
так далее). Это имело два недостатка:
- Отражение довольно медленно в Java, и
- Соглашение об именах не является интуитивно понятным для новых пользователей.
Оба недостатка были устранены с обновлением, так что теперь вы можете называть ваши методы как угодно и указывать, в каком потоке вы хотите, чтобы событие запускалось внутри параметров аннотаций.