2016-03-02 48 views
0

我想在我的項目中使用EventBus,並且遇到問題。 我有一個與一般事件參數片段超類: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並呼籲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

泛型和類型擦除似乎是問題。

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

在通用的抽象類定義是真的

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

由於事件被繼承默認情況下,真實,職位,以EventOne也張貼到其超BaseEvent(和onApiResponse)。您可以在事件總線中修復此禁用事件繼承。假設你使用的是默認eventbus,這可以通過

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

EventBus.getDefault()的第一次使用之前完成

相關問題