Я занимаюсь рефакторингом аспекта моей кодовой базы, который выполняет сетевые запросы для отправки события через EventBus , который я также использую в другом месте для обработки отдельного события. Я публикую события в отдельных классах, но подписываюсь на них в одном классе. При тестировании моей работы старое событие сначала публикует свое событие, а новое - позже. Я обнаружил, что после первых сообщений о событиях по умолчанию используется NoSubscriberEvent для нового события, в котором регистрируется, что подписчик не может быть найден, когда существует аннотированный метод подписчика.
Это для проекта SDK, над которым я работаю, чтобы события публиковались в классе SDK, и на них можно было подписаться в классах приложения. SDK предоставляет запасной метод, если на новом событии нет подписчиков. Я думал, что проблема связана с синхронизацией регистрации класса подписчика на шине относительно класса издателя, поэтому я убедился, что это не проблема
Обратите внимание, что событие публикуется в классе Service, вызванном из Fragment, и в этом случае методы подписчика находятся в родительском Activity, которая содержит фрагмент. Я не включаю почтовый индекс EventBus для нового события, потому что выполнение не удается до того, как оно достигнет этой точки.
SDK Модель:
class BackendServiceA{
void someMethod(){
EventBus.getDefault().post(new EventA(/* Some Params */))
}
}
Модель приложения:
class ParentActivity{
void onCreate(){
super.onCreate();
if (!EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().register(this);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
void oldEventSubscriber(EventA incomingEvent){
//Implementation details
}
@Subscribe(threadMode = ThreadMode.POSTING)
void newEventSubscriber(EventNew incomingEvent){
//Implementation details
}
}
class BaseFragment extends Fragment{
void onResume(){
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
}
@Subscribe(threadMode = ThreadMode.POSTING)
boolean defaultSendImplementation(NoSubscriberEvent noSubEvent) {
NewEvent sendEvent = (NewEvent)noSubEvent.originalEvent;
}
}
Я ожидаю, что при запуске этой последовательности сначала вызывается метод oldEventSubscriber()
, а не метод NoSubscriberEvent. Теперь я получаю ClassCastException, потому что библиотека не может найти подписчика для старого события и вызывает defaultSendImplementation()
. Там операция приведения завершается неудачей, и я получаю исключение.