MVP挂据,全稱 Model-View-Presenter
1滔吠,為什么使用MVP蚪黑?
大部分的安卓應用只使用View-Model結構
程序員現(xiàn)在更多的是和復雜的View打交道而不是解決業(yè)務邏輯。
當你在應用中只使用Model-View時棋凳,到最后队橙,你會發(fā)現(xiàn)“所有的事物都被連接到一起”
god object
god object是十分復雜的坠陈,他的每一個部分都不能重復利用萨惑,無法輕易的測試、或者調試和重構仇矾。
使用 MVP
復雜的任務被分成細小的任務咒钟,并且很容易解決。越小的東西若未,bug越少,越容易debug倾鲫,更好測試粗合。在MVP模式下的View層將會變得簡單,所以即便是他請求數(shù)據(jù)的時候也不需要回調函數(shù)乌昔。View邏輯變成十分直接隙疚。
當你編寫一個Actviity、Fragment磕道、自定義View的時候供屉,你會把所有的和后臺任務相關的方法寫在一個靜態(tài)類或者外部類中。這樣溺蕉,你的Task不再和Activity聯(lián)系在一起伶丐,這既不會導致內存泄露,也不依賴于Activity的重建疯特。
這里有若干種方法處理后臺任務哗魂,但是它們的可靠性都不及MVP。
2漓雅,項目中MVP 代碼簡介
M:Model 數(shù)據(jù)層录别,主要負責項目中的數(shù)據(jù)處理 如訪問網絡數(shù)據(jù) 訪問數(shù)據(jù)庫數(shù)據(jù)等等
V:View 視圖層 主要負責視圖的顯示 開發(fā)中如Activity Fragment等等
P:Presenter 邏輯層 主要負責業(yè)務邏輯的處理 當然 也是連接Model層和View層的橋梁。
2.1 先寫一個協(xié)議類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接口的實現(xiàn)類 這里進行訪問網絡的耗時操作
/**
* 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<IgnoreBean> call = service.getNoAnswer(route);
call.enqueue(new Callback<IgnoreBean>() {
@Override
public void onResponse(Call<IgnoreBean> call, Response<IgnoreBean> 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<IgnoreBean> call, Throwable t) {
listener.onError();
}
});
}
}
2.3 Presenter接口的實現(xiàn)類 該類持有Model實現(xiàn)類的對象和View實現(xiàn)類的對象 進行邏輯處理
/**
* 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 的實現(xiàn)類 也就是Activity或者Fragment
public class UnAnswerFragment extends Fragment implements PersonContract.IUnAnswerView {
該類中持有presenter實現(xiàn)類的對象 用來獲取數(shù)據(jù)
private PersonContract.IUnAnswerPresenter mIUnAnswerPresenter;
實例化:
mIUnAnswerPresenter = new UnAnswerPresenterImpl(this);
請求數(shù)據(jù):
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);
}
請求數(shù)據(jù)后的回調方法
@Override
public void showError() {
Logger.e("------請求數(shù)據(jù)失敗---------");
mKProgressHUD.dismiss();
}
@Override
public void setUnAnswerData(IgnoreBean bean) {
Logger.e(bean.toString());
List<IgnoreBean.DataBean.ResultDataBean> 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();
}