mvp模式下:
Presenter 为业务处理层,既能调用UI逻辑,又能请求数据,该层为纯Java类,不涉及任何Android API。
Model 层中包含着具体的数据请求,数据源。
google的demo中使用了契约类将mvp分为Activity、Fragment、Contract、Presenter四种类文件。view由Activity承担,Presenter做业务,结构清晰。
mvp的使用可以根据项目来做相应的调整:
举个例子:查询数据库数据展示在列表上,Ui需要展示的就是
void showProgress();//展示加载动画 void hideProgress(); //关闭加载在动画 void updateList(List<StepData> list); //加载数据
为了方便更加清晰的管理自己的代码,我也增加了一个约定类,使用契约类来统一管理view与presenter的所有的接口,这种方式使得view、presenter和model中的功能,一目了然。
mvp负责的逻辑一目了然。
public class HistoryContract {
public interface IPresenter {
void loadData(Context context);
void onDestory();
}
public interface IView {
void showProgress();
void hideProgress();
void updateList(List<StepData> list);
}
public interface IModel {
void loadList(Context context, LoadHistoryListListener listener);
}
}
model来处理具体的数据请求,数据源,在model层中我处理的是查询数据库的操作。
LoadHistoryListListener将model的数据回调给persenter。
public class HistoryModelImpl implements HistoryContract.IModel{
@Override
public void loadList(Context context, LoadHistoryListListener listener) {
if(DbUtils.getLiteOrm()==null){
DbUtils.createDb(context, "jingzhi");
}
List<StepData> list =DbUtils.getQueryAll(StepData.class);
Logger.d("stepDatas="+list);
listener.getList(list);
}
}
persenter在mvp中担任的就是负责业务逻辑的的处理,当然可以根据项目的实际情况,将网络请求 和数据源放在persenter中,建议放在model中将业务逻辑和ui分开。persenter将model层和view关联起来。
public class HistoryPersenterImpl implements HistoryContract.IPresenter ,LoadHistoryListListener{
HistoryContract.IView view;
HistoryModelImpl model;
public HistoryPersenterImpl(HistoryContract.IView view) {
this.view = view;
model = new HistoryModelImpl();
}
@Override
public void loadData(Context context) {
view.showProgress();
model.loadList(context,this);
}
@Override
public void onDestory() {
view = null;
}
@Override
public void getList(List<StepData> list) {
view.updateList(list);
}
}
在acticvity中的使用:
Activity在项目中是一个全局的控制者,负责创建view以及presenter实例,并将二者联系起来。
用是Presenter通过model获取数据并调用View的方法来刷新界面。调用的时机是在acitivity主线程中。
public class HistoryActivity extends BaseActivity implements HistoryContract.IView{
@BindView(R.id.rl_recyclerView)
RecyclerView rl_recyclerView;
@BindView(R.id.img_back)
ImageView img_back;
@BindView(R.id.tv_title)
TextView tv_title;
HistoryAdapter adapter;
HistoryPersenterImpl historyPersenter;
@Override
public int getContentViewId() {
return R.layout.activity_history;
}
@Override
public void initView() {
tv_title.setText("步数记录");
historyPersenter = new HistoryPersenterImpl(this);
}
@Override
protected void obtainData() {
historyPersenter.loadData(this);
}
@OnClick(R.id.img_back)
void OnClick(View v){
switch (v.getId()){
case R.id.img_back:
finish();
break;
}
}
@Override
protected void initEvent() {
}
@Override
public void showProgress() {
MyDialog.show();
}
@Override
public void hideProgress() {
MyDialog.hide();
}
@Override
public void updateList(List<StepData> list) {
rl_recyclerView.setLayoutManager(new LinearLayoutManager(this));
if(adapter==null)
adapter = new HistoryAdapter(list,getContext());
rl_recyclerView.setAdapter(adapter);
}
}
end