[toc]
https://github.com/googlesamples
https://github.com/googlesamples/android-architecture
简介
- MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器
- Android本身就采用的是MVC(Model View Controllor)模式、其中Model指的是数据逻辑和实体模型;View指的是布局文件、Controllor指的是Activity
- 从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用
- MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互
- 在 Android中很重要的一点就是对UI的操作基本上需要异步进行也就是在MainThread中才能操作UI,所以对View与Model的切断分离是 合理的
- Presenter与View、Model的交互使用接口定义交互操作可以进一步达到松耦合也可以通过接口更加方便地进行单元测试
具体使用
参考:
- https://www.jianshu.com/p/1f91cfd68d48
- https://github.com/LJYcoder/DevRing
- http://www.jcodecraeer.com/a/anzhuokaifa/2017/1020/8625.html?1508484926
- https://www.jianshu.com/p/364f14c76874
需要写四个部分:Model层,View层,Presenter层,接口
接口
负责“连接”MVP三层,以便方法调用、数据流动。同时也便于进行单元测试。
IView
View层接口,定义View层需实现的方法,P层通过该接口回调通知View层
1 | public interface IMovieView { |
IModel/IService
Model层接口,定义Model层需实现的方法,P层通过该接口调用M层获取/处理数据的方法;有些项目把这块也拆分未Service层,叫法不同而已
1 | public interface IMovieMoel{ |
Model层/Service
实现IModel/IService接口中的方法,负责数据的获取/处理
1 | public class MovieModel implements IMovieMoel{ |
Presenter层
- Presenter处理业务逻辑,调用M层获取数据,调用V层传递展示数据
- Presenter持有一个IView接口,是为了能够通过View接口通知Activity进行更新界面等操作
1 | public class MoviePresenter { |
View层
实现IView接口中的方法,对获取到的数据进行展示。对应日常的Activity/Fragement类,实现Iview接口
1 | public class MovieActivity extends Activity implements IMovieView { |
或者匿名类对象关联:
1 | @Override |
调用
- 在View层初始化时,调用Presenter层方法即可
1 | @Override |
- 如果Presenter层持有了View层的引用,那么记得在V层销毁时,把Presenter层中对View层的引用置null,避免View层回收失败导致内存泄漏
1 | @Override |