我试图在我的项目中使用EventBus,但我遇到了问题。 我有一个带有通用EVENT参数的片段的超类:
public abstract class BaseNetworkFragment<EVENT extends BaseEvent> extends Fragment {
//some code
@Override
public void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
}
@Subscribe
public void onApiResponse(EVENT event) {
//some action
}
}
我有一个超类BaseEvent。 还有2个活动类:
public class EventOne extends BaseEvent{
}
public class EventTwo extends BaseEvent{
}
我使用泛型参数EventOne创建Fragment并调用Api:
public class MyFragment extends BaseNetworkFragment<EventOne> {
//some code
//make request for Api, when ServiceHelper has results it posts EventOne
ServiceHelper.getInstance().getSomeData();
}
现在我不使用EventTwo,一切正常。
但如果我添加im MyFragment代码:
@Subscribe
public void onEventTwo(EventTwo event) {
//some action
}
并呼吁Api服务,因此发布了EventTwo,我有错误。
我的方法onEventTwo();
正常工作,但来自超类的方法onApiResponse();
也接收EventTwo,但它只能接收EventOne!所以我有ClassCastException
我也注意到,如果我从超类中删除方法onApiResponse()
并将其写在MyFragment中,一切都会好的,但我需要超类中的这个方法。
我认为问题出在通用参数中,但我无法解决。 我也使用改造来进行异步请求。 请帮帮我)
答案 0 :(得分:0)
泛型和类型擦除似乎是问题所在。
@Subscribe
public void onApiResponse(EVENT event) {
//some action
}
你的通用抽象类中定义的实际上是
@Subscribe
public void onApiResponse(BaseEvent event) {
//some action
}
由于事件继承在默认情况下为true,因此EventOne的帖子也会发布到其超类BaseEvent(和onApiResponse)。您可以在eventbus中修复此禁用事件继承。假设您正在使用默认的事件总线,可以通过
完成EventBus.builder().eventInheritance(false).installDefaultEventBus()
在第一次使用EventBus.getDefault()之前