为什么80%的码农都做不了架构师?>>>
前言
根据网络上的MVP套路写了一个辣鸡MVP DEMO
用到的
- android studio MVPHelper插件,方便自动生成框架代码
- rxjava
- retrofit
什么是MVP
MVP就是英文的Model View Presenter,然而实际分包并不是只有这三个包,还有一个契约Contract接口包,根据项目情况还可以分更多包
- Contract
- Model
- View 指activity和fragment,需要实现View接口
- Presenter
Contract
定义Model、View、Presenter接口的方法,所有接口都在这里定义
public interface HomeContract {interface Model {void getDate(final BaseCallBack<TitleListBean> callBack);}interface View {//多个事件定义多个刷新页面方法void refreshUi(List<TitleListBean.ContentsBean> list);}interface Presenter {void load();}
}
Model
网络及本地数据请求操作,包括远程数据和本地数据的请求处理
远程数据用retrofit+rxjava实现,本地数据用room+rxjava,无论用什么方法最后都要通过callback返回结果
public class HomeModel implements HomeContract.Model {//获取数据public void getDate(final PresenterBaseCallBack<TitleListBean> callBack) {ApiService apiService = RetrofitUtil.getRetorfit().create(ApiService.class);apiService.getList().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new BaseObserver<TitleListBean>() {@Overridepublic void onNext(TitleListBean model) {Log.d(TAG, "获取数据成功 ");callBack.onResponse(model); //成功的数据请求结果}@Overridepublic void onError(Throwable e) {e.printStackTrace(); //请求过程中发生错误callBack.onFailure("获取数据失败"); //失败的数据请求结果}@Overridepublic void onComplete() {Log.d(TAG, "刷新页面 ");}});}
}
Presenter
可以理解为界面的点击、加载等事件的实现
作为view与model的桥梁,初始化的时候需要传入view对象和new一个model对象
通过view调用presenter,presenter调用model,model返回数据给presenter,presenter再返回数据给view展示
public class HomePresenter implements HomeContract.Presenter {private HomeContract.View homeView;private HomeContract.Model homeModel;private Context mContext;public HomePresenter(HomeContract.View view) {this.homeView = view;this.homeModel = new HomeModel();}@Overridepublic void load() {/*** Presenter层逻辑处理* Presenter已经包含model与view对象* 1.通过model获取数据,new一个callback对象作为参数* 2.callback对象根据model返回的结果执行view的refreshUi方法刷新页面*/this.homeModel.getDate(new PresenterBaseCallBack<TitleListBean>() {@Overridepublic void onResponse(TitleListBean response) {homeView.refreshUi(response.getContents());}@Overridepublic void onFailure(String error) {}});}
}
CallBack
这个接口属于Presenter层,也是model与view的桥梁,把model处理的结果告诉presenter,presenter根据处理结果告诉view刷新页面
public interface PresenterBaseCallBack<T> {void onResponse(T response);void onFailure(String error);
}
VIEW
创建presenter对象,view的所有事件就是对应presenter的方法
public class HomeFragment extends BaseFragment implements HomeContract.View {private HomeContract.Presenter presenter;@Overrideprotected void initView(Bundle savedInstanceState) {presenter = new HomePresenter(this,getContext()); //初始化Presenter,包含view和modelpresenter.load(); //Presenter层逻辑处理}@Overridepublic void refreshUi(List<TitleListBean.ContentsBean> list) { //数据获取成功后的页面刷新//list 就是返回的数据,执行页面刷新}
}
一个辣鸡Demo
戳这里