0

我正在尝试在我的项目中使用 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 并且一切正常。

但是如果我添加我的 MyFragment 代码:

@Subscribe
public void onEventTwo(EventTwo event) {
    //some action
}

并要求 Api 服务发布 EventTwo 结果,我有错误。我的方法onEventTwo();工作正常,但超类中的方法onApiResponse();也接收 EventTwo,但它只能接收 EventOne!所以我有 ClassCastException

我还注意到,如果我onApiResponse()从超类中删除方法并将其写入 MyFragment 一切都会好的,但我需要在超类中使用此方法。

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

4

1 回答 1

0

泛型和类型擦除似乎是问题所在。

@Subscribe
public void onApiResponse(EVENT event) {
    //some action
}

在您的通用抽象类中定义的确实是

@Subscribe
public void onApiResponse(BaseEvent event) {
    //some action
}

由于默认情况下事件继承为真,EventOne 的帖子也会发布到其超类 BaseEvent(和 onApiResponse)。您可以在事件总线中修复此禁用事件继承。假设您使用的是默认事件总线,这可以通过

EventBus.builder().eventInheritance(false).installDefaultEventBus()

在第一次使用 EventBus.getDefault() 之前

于 2016-03-23T12:53:13.813 回答