Как правильно указать несколько подписчиков событий в одном классе, используя EventBus? - PullRequest
0 голосов
/ 02 мая 2019

Я занимаюсь рефакторингом аспекта моей кодовой базы, который выполняет сетевые запросы для отправки события через 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(). Там операция приведения завершается неудачей, и я получаю исключение.

...