EventBus: регистрация без аннотированного метода @Subscribe

У меня есть класс BaseFragment, который регистрирует / отменяет регистрацию в EventBus в onStart()/onStop(), и несколько дочерних классов, которые наследуются от него (FragmentA, _5 _...). Базовый класс не имеет методов, помеченных @Subscribe и FragmentA, но я все равно хочу, чтобы он зарегистрировался на случай, если я добавлю некоторые из них в будущем.

Если я зарегистрирую объект, не имеющий @Subscribe аннотированного метода, то ничего не произойдет, например, при использовании SquareUp's Otto, но EventBus выдает исключение:

org.greenrobot.eventbus.EventBusException: Subscriber class com.company.app.FragmentA and its super classes have no public methods with the @Subscribe annotation

Зачем выбрасывать исключение? Я имею в виду, что это не мешает запуску приложения.

Единственное решение - превратить register()/unregister() вызовы в BaseFragment в уродливый try ... catch или есть более чистый обходной путь?


person flawyte    schedule 02.08.2016    source источник
comment
Ваши методы с аннотацией @Subscribe должны быть общедоступными, проверьте их все.   -  person Oğuzhan Döngül    schedule 02.08.2016
comment
@oguzhand Если вы внимательно прочитаете, то увидите, что у меня вообще нет методов с аннотацией @Subscribe.   -  person flawyte    schedule 02.08.2016
comment
Можете ли вы реализовать фиктивный аннотированный метод в базовом фрагменте?   -  person lelloman    schedule 02.08.2016
comment
почему бы вам не добавить пустой @Subscribe метод? Я думаю, что это исключение выброса на случай, если пользователь забудет добавить метод @Subscribe.   -  person Max    schedule 02.08.2016
comment
@Anders Хорошая идея! Спасибо!   -  person flawyte    schedule 02.08.2016
comment
@Anders Не могли бы вы опубликовать ответ, чтобы я мог его принять?   -  person flawyte    schedule 08.08.2016


Ответы (2)


Если вы хотите, чтобы у ваших дочерних фрагментов не было метода @Subscribe без каких-либо исключений, просто поместите пустой подписчик в базовый класс:

@Subscribe
public void dummyEvent(SomeClassThatWillNeverBePosted event) {}
person Max    schedule 08.08.2016

Я думаю, вам следует регистрировать / отменять регистрацию отдельно для каждого фрагмента. Потому что, если вы сделаете это в базовом фрагменте, ваши дочерние фрагменты регистрируют одни и те же события, но каждый фрагмент имеет разные события.

person faranjit    schedule 02.08.2016