過(guò)往
過(guò)往使用MVP模式,我是將網(wǎng)絡(luò)請(qǐng)求回來(lái)的DataVo盾鳞,緩存在Model的犬性。所以造成,View使用DataVo的時(shí)候腾仅,需要通過(guò):View -> Presenter -> Model乒裆。這個(gè)過(guò)程其實(shí)是十分不方便的。因?yàn)镻resenter和Model需要聲明并實(shí)現(xiàn)DataVo的getter推励。
例子
以獲取列表數(shù)據(jù)并顯示的過(guò)程為例子鹤耍,闡述這種不方便:
View接口:
// 接收列表刷新的事件
void loadRecyclerData();
// 加載數(shù)據(jù)成功的回調(diào)
void loadDataSuccess();
View實(shí)現(xiàn):
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接口:
// 獲取網(wǎng)絡(luò)數(shù)據(jù)
void loadRecyclerData(int page);
// 獲取緩存數(shù)據(jù)
DataVo getRecyclerData(int position);
Presenter實(shí)現(xiàn):
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接口:
// 獲取網(wǎng)絡(luò)數(shù)據(jù)
boolean loadRecyclerData(int page);
// 獲取緩存數(shù)據(jù)
DataVo getRecyclerData(int position);
Model實(shí)現(xiàn):
private List<DataVo> mDataVos;
boolean loadRecyclerData(int page) {
mDataVos = MyNetAction(URL, BODY);
return mDataVos == null;
}
DataVo getRecyclerData(int position) {
mDataVos.get(position);
}
可以看到,緩存數(shù)據(jù)在Model中验辞,View獲取要顯示的數(shù)據(jù)稿黄,都必需通過(guò)Presenter -> Model獲取。
使用新的約定
網(wǎng)絡(luò)請(qǐng)求回來(lái)的數(shù)據(jù)跌造,緩存在View中抛猖。
View接口:
// 接收列表刷新的事件
void loadRecyclerData();
// 加載數(shù)據(jù)成功的回調(diào)
void loadDataSuccess(List<DataVo> mDataVos);
View實(shí)現(xiàn):
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接口:
// 獲取網(wǎng)絡(luò)數(shù)據(jù)
void loadRecyclerData(int page);
Presenter實(shí)現(xiàn):
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直接以靜態(tài)的方式實(shí)現(xiàn):
public static List<DataVo> loadRecyclerData(int page) {
mDataVos = MyNetAction(URL, BODY);
return mDataVosl;
}