前言
根据网络上的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>() {
@Override
public void onNext(TitleListBean model) {
Log.d(TAG, "获取数据成功 ");
callBack.onResponse(model); //成功的数据请求结果
}
@Override
public void onError(Throwable e) {
e.printStackTrace(); //请求过程中发生错误
callBack.onFailure("获取数据失败"); //失败的数据请求结果
}
@Override
public 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();
}
@Override
public void load() {
/**
* Presenter层逻辑处理
* Presenter已经包含model与view对象
* 1.通过model获取数据,new一个callback对象作为参数
* 2.callback对象根据model返回的结果执行view的refreshUi方法刷新页面
*/
this.homeModel.getDate(new PresenterBaseCallBack<TitleListBean>() {
@Override
public void onResponse(TitleListBean response) {
homeView.refreshUi(response.getContents());
}
@Override
public 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;
@Override
protected void initView(Bundle savedInstanceState) {
presenter = new HomePresenter(this,getContext()); //初始化Presenter,包含view和model
presenter.load(); //Presenter层逻辑处理
}
@Override
public void refreshUi(List<TitleListBean.ContentsBean> list) { //数据获取成功后的页面刷新
//list 就是返回的数据,执行页面刷新
}
}