Android MVP模式(三)
前言
看了google官方的MVP模式结构和一些不同网络上的文章,有比较多优化之前所说的普通mvp模式的方案。今天就说说google官方推荐的一个mvp形式。
Contract类
google在原先mvp三层结构分开不同类和不同结构的基础上加入了一个叫Contract的类,中文翻译是契约的意思。主要作用就是将三层(M、V、P)或者两层(V、P)的接口做一个管理。至于为什么会出现只有两层,后面会说...
public class WXContract {
interface View extends BaseView {
void setData(List<WXInfoModle> list);
}
interface Presenter extends BasePresenter<View> {
void loadData();
} }
这是上一次我写微信好友列表的V层还有P层的接口,采用契约后我把改成了上面这样的代码。两个接口都存在继承,这是关系到mvp模式的封装问题。这里我是直接使用android studio的插件生成的。这里有这个插件的教程,可以看看:请输入链接描述
使用插件生成的代码也包括了BaseActivity和BaseFragment的封装,base的P层直接封装在它们的里面。同理,base的V层直接封装在base的P层。所以在实际使用时不需要实例出来。
关于Model层的应用问题
网上对于M层的作用出现得比较多的有两个版本,一个是像我之前写的用它来初始化数据,比如生成一个list或者网络请求拿数据,但是我看了比较多的文章包括google的官方版本他们都比较倾向将M层用作bean类来使用,就是仅仅只是用它来做自定义类的封装。而把数据的初始化之类的操作交给了P层。也就出现了上述所说的契约类只管理两层的接口,因为这样的话M层压根没有接口。本人暂时分析不出孰优孰劣。但我本人也倾向于第二种方案,毕竟P层如果单单是调用M层和V层的方法感觉有点浪费,而且代码也有点强迫症了(个人感觉~~)。
所以最后P层的代码就取代了原来M层的代码。在P层完成list的生成后直接后调给V层
public class WXPresenter extends BasePresenterImpl<WXContract.View> implements WXContract.Presenter{
private List<WXInfoModle> list;
@Override
public void loadData() {
list=new ArrayList<>();
for(int i=0;i<10;i++){
WXInfoModle wxInfoBean=new WXInfoModle();
wxInfoBean.setUserName(i+"");
wxInfoBean.setInfoDetail("Hello WeChat!");
wxInfoBean.setInfoTime(i+"");
list.add(wxInfoBean);
}
mView.setData(list);
}
}
最后
这个是google官方对于MVP模式demo的GitHub,里面包括这种最基本的还有其他不同魔改版的mvp模式:请输入链接描述
还有上面说到插件这里也说一个有关Android的控件实例化、事件监听的注解式生成工具插件:请输入链接描述 用这个可以大大提高开发效率,说实话个人感觉findViewById是一个很坑的方法(控件多起来简直要命!)。