2017-01-02 33 views
0

最近我使用MVP開發Android應用程序。Android Bug或Java Bug:執行回調時發現錯誤實例

但我發現一個Android的Bug(也許我是錯的)

我有兩個主持人NewsPresenterMainPresenterNewsPresenter在片段NewsFragment創建一個實例,並MainPresenter是在活動MainActivty創建的實例。當然MainActivity包括NewsFragment。既2演示者有兩個方法來實現,其處理成功響應和失敗的響應。

NewsPresenter

public class NewsPresenter extends IPresenter implements IAdapter.OnRecycleItemClickListener{ 
@Override 
protected void onIRequestSuccess(int requestId, IResponse response) { 
    Log.e("TAG","onIRequestSuccess:"+requestId); 
    .... 
} 

@Override 
protected void onIRequestFail(int requestId, Throwable throwable) { 
    Log.e("TAG","onIRequestFail:"+requestId); 
    ... 

} 
} 

MainPresenter

public class MainPresenter extends IPresenter{ 

public MainPresenter(Context context, IMain iMain) { 
    super(context); 
} 

@Override 
protected void onIRequestSuccess(int requestId, IResponse response) { 
    //do nothing 
} 

@Override 
protected void onIRequestFail(int requestId, Throwable throwable) { 
    //do nothing 
} 
} 

現在,在NewsPresenter我儘量讓網絡request.In的BasePresenter這是它的超類我做一個日誌顯示哪些嘗試執行網絡request.And日誌類是:

01-02 20:09:28.281 17206-17206/com.chengtao.culture E/BasePresenter: class com.chengtao.culture.presenter.NewsPresenter 

這意味着NewsPresenter執行請求。

但在IPresente這是NewsPresenterMainPresenter超一流的,我儘量讓日誌,以顯示其處理response.And日誌是類:

01-02 20:09:38.352 17206-17206/com.chengtao.culture E/TAG: class com.chengtao.culture.presenter.MainPresenter 

這幹線的MainPresenter手柄響應。

IPresenter

abstract class IPresenter extends BasePresenter{ 
IPresenter(Context context) { 
    super(context); 
} 

@Override 
public void onRequestSuccess(int requestId, BaseResponse response) { 
    Log.e("TAG",this.getClass().toString()); 
    IResponse response1 = (IResponse) response; 
    Log.e("TAG","onRequestSuccess"); 
    onIRequestSuccess(requestId,response1); 
} 
@Override 
public void onRequestFail(int requestId, Throwable throwable) { 
    Log.e("TAG",this.getClass().toString()); 
    if (throwable == null || throwable.getMessage() == null){ 
     throwable = new Throwable("請求超時"); 
     onIRequestFail(requestId,throwable); 
    }else { 
     onIRequestFail(requestId,throwable); 
    } 
} 

protected abstract void onIRequestSuccess(int requestId, IResponse response); 
protected abstract void onIRequestFail(int requestId, Throwable throwable); 

} 

我很困惑,爲什麼我用NewsPresenter發出請求,但MainPresenter處理響應?這不是科學,因爲日誌顯示該請求是NewsPresenter執行,MainPresenter有與NewsPresenter沒有關係只是他們兩個延伸IPresenter

但是,一旦我在Activity中刪除了MainPresenter的實例,響應將由NewsPresenter處理。

要看到整個代碼:https://github.com/ParadiseHell/cultural-creative/tree/master/app/Culture

我要確保我的代碼是所有的權利,所以我不知道是Android bug或它的Java bug。如果有人知道,請告訴我,謝謝。

回答

0

首先我要說,我用MVP的權利,只是因爲我的library有一個錯誤,我已經固定它。

在庫中,還有一類AsyncHttpClient這是單例模式,當然這是錯的,因爲我可以初始化整個項目只有一個響應接口,但每個發言人的響應接口,所以它是壞的處理響應。所以我刪除單例模式,使用公共構造函數,並且問題消失。

所以這不是Android錯誤或Java錯誤,只是我的錯誤,思維更少。

0

首先你的MVP架構是錯誤的。列表和適配器都涉及到用戶界面,所以適配器邏輯必須與片段不與主持人。

您應該創建一個名爲「Service Class」的對象,它將擴展發送真實API調用的BaseService。

每個API調用都必須有每個單獨的Service Class。我們應該將回調方法設置爲該serviceclass對象,以便在執行API調用時接收該特定函數的回調。 解釋上述段落的示例代碼。

class GetNewsService extends BaseService { 

void doApiCall(){ 
// execute API call . Put the request related code in BaseService. 
} 
} 

class NewsPresenter { 
// I am writing psudeo code only. 

void getNews(){ 
    GetNewsService newsService=new GetNewsService(); 
    newsService.setCallBack(new RequestClass(){ 
    @Override 
    onSuccessMethod(Response response){ 
// send response object to view class through interface and update adapter there 
} 

    @Override 
    onFailMethod(Error error){} 
    }); 
    newsService.doApiCall(); 
    } 
} 
+0

你的代碼是正確的,但我不認爲我沒有錯。因爲你不知道有多少個請求,所以我讓'IPresenter'執行所有請求並支持兩種抽象方法來處理所以每個主持人只是擴展'IPresenter'並通過'requestId'處理響應。 **所以我不需要在每個request.**@Sairam Rachapudi – ChengTao

+0

中設置回調我只想問你如何解釋,當我刪除'MainPresenter'的實例時,我可以在'NewsPresenter'中正確回調。但是當我補充時,它不會。@ Sairam Rachapudi – ChengTao