如何使用EventBus在同一个类别中正确指定多个事件订阅者?

时间:2019-05-02 20:04:18

标签: java android greenrobot-eventbus greenrobot-eventbus-3.0

我正在重构代码库的一个方面,该方面会进行网络请求以通过EventBus发送事件,我还在其他地方使用它来处理单独的事件。我将事件发布在单独的班级中,但在同一班级中订阅它们。在测试我的作品时,旧事件首先发布事件,新事件随后提交。我发现在第一个事件发布之后,它默认为新事件的NoSubscriberEvent,记录下当存在带注释的订户方法时,找不到订户。

这是针对我正在开发的SDK项目的,因此事件可以发布在SDK类中,并且可以在应用程序类中进行订阅。如果新事件上没有订阅者,则SDK会提供一个后备方法。我认为问题与计时相对于发布者类的订户类到总线的注册时间有关,因此已经证实这不是问题

请注意,该事件被发布到从Fragment调用的Service类中,在这种情况下,订户方法位于包含该片段的父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()。在那里,强制转换操作失败,并且出现异常。

0 个答案:

没有答案