MVP使用以及简单封装
MVP具体封装见博客:高级MVP架构封装演变全过程
Demo地址:https://github.com/wtt123/MvpDemo
最近在项目中使用了mvp模式,在此做一个学习总结:
MVP的认识:
- 首先熟悉mvc与mvp的最清晰明了的区别: MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的。
- MVP模式的优点:MVP中将逻辑层与view层分离开,结构清晰,代码也易读易懂,model层负责数据的请求和数据的处理,写好presenter和view后,基本不用改,只需要关注model的变化就可以,另外一个好处是activity内部类的使用基本上已经很少了,部分ui逻辑判断也可以转到presenter去处理,ui层也非常清晰干净。
- MVP的缺点:产生比较多的类
MVP的实例应用:
(大概的架构就是如上图)
架构解释
- model层里我主要封装了网络请求的逻辑
- presenter里我主要处理了相对应activity层的逻辑(比如点击按钮请求网络,成功/失败后通过在view层写的相对应的接口类把方法回调给activity)
- view里主要放回调接口,presenter与activity(ui层通讯),通过暴露出来的接口回调,在presenter里使用view里的方法传一些东西给activity,然后我ui上执行操作改变等
代码分析
Demo现在做一个简单的操作,来熟悉练习MVP,页面显示倒计时,点击按钮请求网络,因为之前写的一个项目中每个页面都需要倒计时,所以做个案例的时候,我把倒计时和loading的显示和隐藏放在了父接口BaseMvpView中,所有的所有mvpView都要继承父类,这样写的话减少每个接口方法都写同种方法
- 写一个基类MvpView,里面放每个activity中都将用到的方法
/**
* 所有mvpView的父接口
* 里面写的方法基本上每个activity都要用的
*/
public interface BaseMvpView {
Activity getActivity();
void toTime(int millisUntil, CountDownTimer timer);
//loading隐藏
void hideLoading();
//loading显示
void showLoading();
}
- 对应acticty写自己的mvpview(继承父view),暴露出自己要的东西,我这边把网络请求后的结果回调给我的activity
/**
* Created by wangting on 2018/2/24.
* MainActivity对于要实现的接口
*/
public interface MainView extends BaseMvpView{
void toMainActivity(Object data);
}