2016-03-02 2 views
0

Я пытаюсь использовать EventBus в своем проекте, и у меня есть проблема. У меня есть супер-класс для фрагментов с родовым параметром EVENT:GreenRobot EventBus принимает ошибочное событие

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 и требуют Апи:

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, все будет в порядке, но мне нужен этот метод в суперклассе.

Я думаю, что проблема в общем параметре, но я не могу это исправить. Также я использую модификацию для асинхронных запросов. Пожалуйста, помогите мне)

ответ

0

Дженерики и стирание типа, кажется, проблема.

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

определен в вашем родовом абстрактном классе действительно

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

Из-за наследованием события является истинным по умолчанию сообщение в EventOne также размещено его суперкласс BaseEvent (и onApiResponse). Вы можете исправить это отключение наследования событий в вашем eventbus. Предполагая, что вы используете eventbus по умолчанию, это может быть сделано

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

перед первым использованием EventBus.getDefault()

Смежные вопросы