MVP,全称 Model-View-Presenter
1,为什么使用MVP?
大部分的安卓应用只使用View-Model结构
程序员现在更多的是和复杂的View打交道而不是解决业务逻辑。
当你在应用中只使用Model-View时,到最后,你会发现“所有的事物都被连接到一起”
god object
god object是十分复杂的,他的每一个部分都不能重复利用,无法轻易的测试、或者调试和重构。
使用 MVP
复杂的任务被分成细小的任务,并且很容易解决。越小的东西,bug越少,越容易debug,更好测试。在MVP模式下的View层将会变得简单,所以即便是他请求数据的时候也不需要回调函数。View逻辑变成十分直接。
当你编写一个Actviity、Fragment、自定义View的时候,你会把所有的和后台任务相关的方法写在一个静态类或者外部类中。这样,你的Task不再和Activity联系在一起,这既不会导致内存泄露,也不依赖于Activity的重建。
这里有若干种方法处理后台任务,但是它们的可靠性都不及MVP。
2,项目中MVP 代码简介
M:Model 数据层,主要负责项目中的数据处理 如访问网络数据 访问数据库数据等等
V:View 视图层 主要负责视图的显示 开发中如Activity Fragment等等
P:Presenter 逻辑层 主要负责业务逻辑的处理 当然 也是连接Model层和View层的桥梁。
2.1 先写一个协议类Contract,用来放Model层 View层 presenter层的接口以及回调接口
//---------------------Master Role My Disabuse unAnswered fragemtn-------------------------------------
public interface IUnAnswerModel {
void loadUnAnswerData(RequestBody route,OnUnAnswerListener listener);
}
public interface OnUnAnswerListener {
void onError();
void onSuccessUnAnswerData(IgnoreBean bean);
}
public interface IUnAnswerView {
void showError();
void setUnAnswerData(IgnoreBean bean);
}
public interface IUnAnswerPresenter {
void getUnAnswerData(RequestBody route);
}
2.2 写Model接口的实现类 这里进行访问网络的耗时操作
/**
* Created by zhang on 2017/5/9.
*/
public class UnAnswerModelImpl implements PersonContract.IUnAnswerModel {
@Override
public void loadUnAnswerData(RequestBody route, final PersonContract.OnUnAnswerListener listener) {
Retrofit retrofit = RetrofitSingleton.getInstance().getRetrofit();
PersonService service = retrofit.create(PersonService.class);
Call call = service.getNoAnswer(route);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response != null && response.body() != null && response.body().getData() != null && response.body().getData().getResultData() != null) {
listener.onSuccessUnAnswerData(response.body());
} else {
listener.onError();
}
}
@Override
public void onFailure(Call call, Throwable t) {
listener.onError();
}
});
}
}
2.3 Presenter接口的实现类 该类持有Model实现类的对象和View实现类的对象 进行逻辑处理
/**
* Created by zhang on 2017/5/9.
*/
public class UnAnswerPresenterImpl implements PersonContract.IUnAnswerPresenter,PersonContract.OnUnAnswerListener {
private PersonContract.IUnAnswerView mIUnAnswerView;
private PersonContract.IUnAnswerModel mIUnAnswerModel;
public UnAnswerPresenterImpl(PersonContract.IUnAnswerView mIUnAnswerView) {
this.mIUnAnswerView = mIUnAnswerView;
this.mIUnAnswerModel = new UnAnswerModelImpl();
}
@Override
public void getUnAnswerData(RequestBody route) {
mIUnAnswerModel.loadUnAnswerData(route,this);
}
@Override
public void onError() {
mIUnAnswerView.showError();
}
@Override
public void onSuccessUnAnswerData(IgnoreBean bean) {
mIUnAnswerView.setUnAnswerData(bean);
}
}
2.4 View 的实现类 也就是Activity或者Fragment
public class UnAnswerFragment extends Fragment implements PersonContract.IUnAnswerView {
该类中持有presenter实现类的对象 用来获取数据
private PersonContract.IUnAnswerPresenter mIUnAnswerPresenter;
实例化:
mIUnAnswerPresenter = new UnAnswerPresenterImpl(this);
请求数据:
private void initData() {
mParamsBean = new CommentParamBean.ParamsBean();
if (mType == ANSWERED) {
mParamsBean.setStatus("1");
} else {
mParamsBean.setStatus("0");
}
mParamsBean.setHasPublic("true");
mRequestBody = Utils.set5param(UserSingleton.getInstance(getContext()).getId(), 10, page, 2, mParamsBean);
mIUnAnswerPresenter.getUnAnswerData(mRequestBody);
}
请求数据后的回调方法
@Override
public void showError() {
Logger.e("------请求数据失败---------");
mKProgressHUD.dismiss();
}
@Override
public void setUnAnswerData(IgnoreBean bean) {
Logger.e(bean.toString());
List resultData = bean.getData().getResultData();
totalPage = bean.getData().getPageModel().getTotalPage();
if (isRefresh) {
mList.clear();
}
mList.addAll(bean.getData().getResultData());
mAdapter.notifyDataSetChanged();
if (isRefresh) {
isRefresh = false;
mXRecyclerView.refreshComplete();
} else {
mXRecyclerView.loadMoreComplete();
}
mKProgressHUD.dismiss();
}