过往
过往使用MVP模式,我是将网络请求回来的DataVo,缓存在Model的。所以造成,View使用DataVo的时候,需要通过:View -> Presenter -> Model。这个过程其实是十分不方便的。因为Presenter和Model需要声明并实现DataVo的getter。
例子
以获取列表数据并显示的过程为例子,阐述这种不方便:
View接口:
// 接收列表刷新的事件
void loadRecyclerData();
// 加载数据成功的回调
void loadDataSuccess();
View实现:
public void loadRecyclerData() {
mPresenterImpl.loadRecyclerData(page);
}
public void loadDataSuccess() {
mAdapter.notifyDataSetChanged();
}
// 列表适配器
public class MyAdapter extend XXAdapter {
public void onBindViewHolder(MyViewHolder mHolder, int position) {
mHolder.setShowData(mPresenter.getRecyclerData(position);
}
}
Presenter接口:
// 获取网络数据
void loadRecyclerData(int page);
// 获取缓存数据
DataVo getRecyclerData(int position);
Presenter实现:
void loadRecyclerData(int page) {
new MyAsyncTask() {
boolean doInBackground() {
return mModel.loadRecyclerData(page);
}
void onPostExecute(boolean isSuccess) {
if (isSuccess) {
mView.loadDataSuccess();
}
}
}
}
DataVo getRecyclerData(int position) {
mModel.getRecyclerData(position);
}
Model接口:
// 获取网络数据
boolean loadRecyclerData(int page);
// 获取缓存数据
DataVo getRecyclerData(int position);
Model实现:
private List<DataVo> mDataVos;
boolean loadRecyclerData(int page) {
mDataVos = MyNetAction(URL, BODY);
return mDataVos == null;
}
DataVo getRecyclerData(int position) {
mDataVos.get(position);
}
可以看到,缓存数据在Model中,View获取要显示的数据,都必需通过Presenter -> Model获取。
使用新的约定
网络请求回来的数据,缓存在View中。
View接口:
// 接收列表刷新的事件
void loadRecyclerData();
// 加载数据成功的回调
void loadDataSuccess(List<DataVo> mDataVos);
View实现:
public void loadRecyclerData() {
mPresenterImpl.loadRecyclerData(page);
}
public void loadDataSuccess(List<DataVo> mDataVos) {
mAdapter.setData(mDataVos);
mAdapter.notifyDataSetChanged();
}
// 列表适配器
public class MyAdapter extend XXAdapter {
private List<DataVo> mDataVos;
public void setData(List<DataVo> mDataVos) {
this.mDataVos = mDataVos;
}
public void onBindViewHolder(MyViewHolder mHolder, int position) {
mHolder.setShowData(mDataVos.get());
}
}
Presenter接口:
// 获取网络数据
void loadRecyclerData(int page);
Presenter实现:
void loadRecyclerData(int page) {
new MyAsyncTask() {
List<DataVo> doInBackground() {
return mModel.loadRecyclerData(page);
}
void onPostExecute(List<DataVo> mDataVos) {
if (mDataVos != null) {
mView.loadDataSuccess(mDataVos);
}
}
}
}
Model直接以静态的方式实现:
public static List<DataVo> loadRecyclerData(int page) {
mDataVos = MyNetAction(URL, BODY);
return mDataVosl;
}