首先,这篇文章不在讲解什么是mvp模式,若是须要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的建立和mvp各自层的界限.另外这个博客属于我的使用mvp模式后一些经验总结与记录.并非最好思想的mvp.还有如下总结的mvp都是使用最简单的mvp模式说明,不是其余大神那种一个类放M/V/P3个内部类(我的不喜欢这种模式),也不是须要各类继承的mvp模式.web
分别是:缓存
我的建议书写顺序是,m>v>p.至于为何下面讲解:网络
上面只是说明了书写顺序,当是实际上mvp是6个类(3个接口类,3个实现类)的模块,因此咱们须要了解MVP真正6个类应该以一个怎么样的思惟分别去按顺序建立他们.异步
已开始写MVP的时候,很是容易把mvp的各类界限搞混,写着写着就容易把P层的逻辑写到V层上,致使P层变成一个衔接反而啥都没作,这很正常.由于开发Android App自己在使用MVP开发上会或多或少的有些模糊,跟web端的mvp多多少少有些不一样.下面咱们就来讲一下Android开发mvp的各自界限spa
1.首先切记M层不能持有任何其余层的实例,由于它不须要调用其余2个层code
2.只书写须要使用的网络请求操做(请求网络/暂停网络请求/销毁网络请求),不写任何的数据处理逻辑,数据只返回给P层作判断组装orm
3.不拦截处理网络报错和异常,全部网络报错和异常通通交给上一层P层去判断blog
4.在Android里,建议写销毁方法,固然activity被销毁的时候按层级分别向下销毁,最终会销毁M层的网络请求.不然M的网络请求不被销毁会出现报错问题继承
接口代码例子:接口
public interface DemoModel { void pullDataApi(int id,PDataLinstener linstener);//获取数据 这里的PDataLinstener是负责网络数据异步给上面的P层的接口 void pushDataApi(int id,final PDataLinstener linstener);//提交数据 void stopPullDataApi();//暂停获取数据 void stopDataPushApi();//暂停提交数据 void destroy();//销毁 }
1.它持有M层和V层的实例
2.它负责调用View方法导入数据
3.它负责调用M层方法请求网络
3.负责分类数据或者格式化数据(文本/颜色值/图片资源id),好比TextView上有一个状态是赞成和拒绝,那么你在P层就要分类好而后在将文本String调用View方法导入
4.缓存变量数据,个别Activity在销毁以前都须要缓存一些数据,那么这些数据交给P层缓存
5.有适配器adapter的activity,适配器应当交给P层建立组装数据,在分配给ListView或者RecyclerView
6.须要实现销毁方法,而且在这个销毁方法里调用M层的销毁方法
接口代码例子:
public interface DemoPresenter { void initView(Activity view);//初始化持有View层 Android的view就是activity,是activity传入的 void initModel();//初始化持有Model层 void bufferData(int id);//获得Intent传入的须要缓存的数据 也缓存能够是从M层返回的数据 void pullData(int id);//获取数据 void pushData(int id);//提交数据 void stopPullData();//暂停获取数据 void stopPushData();//暂停提交数据 void formatTimeText();//格式化时间文本 void handlerData();//处理获取后的数据,而且负责调用View方法导入数据 void destroy();//销毁 }
1.它只能持有P层实例
2.提供全部view的数据导入方法(包括文本/颜色值/图片资源id等等)
3.它不能处理任何数据逻辑(只能处理是其余activity传入的数据,获取后交给P层缓存)
4.不缓存任何数据
5.弹窗对话框能够在V层建立
6.为了避免让点击事件太复杂,只要是activity跳转的点击事件(activity跳转还要给调给P层处理是太多余),让V层处理.可是若是是网络请求的点击事件,点击后请调用P层的网络请求方法.
7.能够从持有的P层上获取缓存数据用于传出到其余activity
8.在有由于有多种状态值,致使一个view须要显示各类不一样的数据的时候(好比根据状态改变文字颜色或者图标),这个view能够单独写一个方法来导入它的数据.这样数据分类在P层,可是你始终调用这个方法导入不一样的数据
9.只有固定数据的view,能够统一使用一个方法所有导入.
10.须要重写销毁方法,将P层的销毁方法调用
接口代码例子:
public interface DemoView { void initView(); void initPresenter(); void getIntentData();//获取activity传入的数据 void initListener();//初始化监听 void addStateViewData(String content, @IdRes int textColor);//添加状态View数据 void addViewData(String view1Content,String view2Content,String view3Content);//添加View的数据 void goneBtn();//隐藏按键 void visibleBtn();//显示按键 MaterialDialog pullDataWaitDialog();//获取数据等待对话框 MaterialDialog pushDataWaitDialog();//提交数据等待对话框 void networkErrorToast();//网络异常提示 void pushSuccessToast();//提交数据成功提示 }
Android端的整个mvp实现后,m层和v层将会十分简洁.p层会相对复杂.当你发现你的m层和v层能一眼看明白全部代码的时候,你的mvp模式差很少就完美了.