GreenRobot EventBus收到错误的事件

时间:2016-03-02 14:07:07

标签: android generics greenrobot-eventbus

我试图在我的项目中使用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中,一切都会好的,但我需要超类中的这个方法。

我认为问题出在通用参数中,但我无法解决。 我也使用改造来进行异步请求。 请帮帮我)

1 个答案:

答案 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()

之前