2017-01-02 56 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