简述

MVC:即Model,View,Controller

代码流程:

MVP: 即Model,View,Presenter;是从经典的MVC模式演变出来的升级版。

代码流程:

在MVP中各层负责的内容是这样的...
  • Model层

负责访问数据,数据源可以是远端数据,也可是本地数据库内的数据.

  • View层

对应的Activity、Fragment类

  • Presenter

负责View层与Model层的交互

MVP与MVC的区别
MVP与MVC的最大区别在于MVC允许View层对Model层直接进行交互,而MVP则不然,MVP中Model层只能通过Presenter与View层进行交互极大程度上实现了解耦。
MVP在代码中的基本流程

个人理解: MVP在庞大的项目结构中可能会充分发挥作用,可以由不同的人来完成不同的模块,充分的节省项目开发周期。但是应用在小项目里,却是增加了不少的类与接口,同时也增加了代码量,让本来很简洁的代码变得繁重。

实例:

大致流程

首先创建对应的接口 DemoView DemoModel DemoPresenter onFunctionListener 接口创建好了之后创建对应的实现类 MainActivity DemoModelClass DemoPresenterClass 以及对应的实体类

DemoView接口中所做的操作

public interface DemoView {// 开始网络请求的动画效果void showDialogDemo();// 关闭动画效果void dismissDialogDemo();// 请求成功void MainSuccess(Object object);// 请求失败void MainFial(Throwable throwable);
}
复制代码

DemoModel接口中的操作

// 主要是网络请求
public interface DemoModel {void shozanen(int id, OnFunctionListener listener);// 发现的接口数据void search(OnFunctionListener listener);}
复制代码

DemoPresenter接口

public interface DemoPresenter {// 用来调用M层网络请求void dataprocessing(int id);// 具体操作结束后关闭当前Viewvoid onDestroy();
}
复制代码

MainActivity 需要实现View的接口

public class MainActivity extends AppCompatActivity implements DemoView {private ImageView mImageView;private TextView mTextView;private Button mButton;private ProgressBar mBar;private DemoPresenterClass mLoginPresenter;private TextView mFial;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImageView = (ImageView) findViewById(R.id.imageTV);mTextView = (TextView) findViewById(R.id.text_name);mButton = (Button) findViewById(R.id.ok_BT);mBar = (ProgressBar) findViewById(R.id.progr);mFial = (TextView) findViewById(R.id.fialTV);mLoginPresenter = new DemoPresenterClass(this);mButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.d("MainActivity", "点击事件");mLoginPresenter.dataprocessing(1);}});}@Overridepublic void showDialogDemo() {mBar.setVisibility(View.VISIBLE);}@Overridepublic void dismissDialogDemo() {mBar.setVisibility(View.GONE);}@Overridepublic void MainSuccess(Object object) {Log.d("MainActivity", "接收到最终的请求成功数据");Toast.makeText(this, "网络请求成功", Toast.LENGTH_SHORT).show();List<SearchEntity> list = (List<SearchEntity>) object;mTextView.setText(list.get(2).getKeyword());}@Overridepublic void MainFial(Throwable throwable) {Log.d("MainActivity", "最终接收到的失败数据");mFial.setText(throwable+"");}
}
复制代码

Presenter实现类

public class DemoPresenterClass implements DemoPresenter, OnFunctionListener {private DemoView mDemoView;private DemoModel mDemoModel;public DemoPresenterClass(DemoView demoView) {this.mDemoView = demoView;// 这里new出来的是Mode层的实现类this.mDemoModel = new DemoModelClass();}@Overridepublic void dataprocessing(int id) {Log.d("DemoPresenterClass", "准备网络请求");mDemoView.showDialogDemo();Log.d("DemoPresenterClass", "开始请求动画");switch (id){case 5:Log.d("DemoPresenterClass", "开始网络请求");mDemoModel.shozanen(id, this);break;case 1:Log.d("DemoPresenterClass", "开始网络请求search");mDemoModel.search(this);break;default:}}@Overridepublic void onDestroy() {mDemoView = null;}@Overridepublic void onSuccess(Object object) {Log.d("DemoPresenterClass", "接收Model请求成功层发来的数据");mDemoView.dismissDialogDemo();Log.d("DemoPresenterClass", "关闭请求动画");if (mDemoView != null) {Log.d("DemoPresenterClass", "将请求成功的数据发送到Activity");mDemoView.MainSuccess(object);}}@Overridepublic void onFail(Throwable throwable) {mDemoView.dismissDialogDemo();mDemoView.MainFial(throwable);Log.d("DemoPresenterClass", "接收Model层请求失败发来的数据");Log.d("DemoPresenterClass", "异常:" + throwable);}
}
复制代码

Model实现类

// 在这个类中做对数据的请求以及数据处理,并将数据发送给Presenterpublic class DemoModelClass implements DemoModel {@Overridepublic void shozanen(int id, final OnFunctionListener listener) {Log.d("DemoModelClass", "正在网络请求");RetrofitEncapsulation.getInstance().getFunctionApi().getShoZane(id).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<ShoZaneEntity>() {@Overridepublic void accept(@NonNull ShoZaneEntity shoZaneEntity) throws Exception {Log.d("DemoModelClass", "请求成功,发送数据");listener.onSuccess(shoZaneEntity);}}, new Consumer<Throwable>() {@Overridepublic void accept(@NonNull Throwable throwable) throws Exception {Log.d("DemoModelClass", "请求失败,发送数据");listener.onFail(throwable);}});}@Overridepublic void search(final OnFunctionListener listener) {Log.d("DemoModelClass", "正在网络请求search");RetrofitEncapsulation.getInstance().getFunctionApi().getSearch().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<List<SearchEntity>>() {@Overridepublic void accept(@NonNull List<SearchEntity> shoZaneEntities) throws Exception {Log.d("DemoModelClass", "请求成功,发送数据ShoZane");listener.onSuccess(shoZaneEntities);}}, new Consumer<Throwable>() {@Overridepublic void accept(@NonNull Throwable throwable) throws Exception {Log.d("DemoModelClass", "请求失败,发送数据ShoZane");listener.onFail(throwable);}});}}复制代码

最后onFunctionListener

public interface OnFunctionListener {// 成功void onSuccess(Object object);// 失败void onFail(Throwable throwable);
}
复制代码

效果展示:

最后的Log打印:

GitHub地址

此文为个人愚见,若有不足还望指点!

Android - MVP个人愚见相关推荐

  1. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  2. Android MVP模式 简单易懂的介绍方式

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200 转载于:https://www ...

  3. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  4. Android MVP Presenter 中引发的空指针异常

    Android MVP Presenter 中引发的空指针异常 参考文章: (1)Android MVP Presenter 中引发的空指针异常 (2)https://www.cnblogs.com/ ...

  5. Android MVP和Dagger2

    In this tutorial, we'll be implementing MVP pattern along with Dagger2 in our Android Application. I ...

  6. Android MVP(三)内存泄漏分析与动态代理

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  7. Android MVP(四)运用反射配置泛型 Model

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  8. Android MVP 模式使用指南

    参考github代码:github 参考博客:Google 官方Android MVP架构实践 简单的以google官方代码和自己的demo记录Android的MVP设计模式. 1.官方MVP模式: ...

  9. Android MVP 详解(上)

    作者:李旺成 时间:2016年4月3日 "Android MVP 详解(下)"已经发布,欢迎大家提建议. MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点 ...

最新文章

  1. 在CentOS 7服务器中使用Jexus发布.net core webapi
  2. linux图片添加滤镜,PhotoFlare开源图像和照片编辑器,附在Ubuntu 18.04下的安装方法...
  3. Lambda表达式将数组/字符串列表转换为数组/整数列表
  4. Popclip插件:任务自动添加进 Microsoft ToDo的任务列表
  5. Squid代理服务器
  6. java 调用打印机打印PDF文件
  7. C++中实现调用外部程序的方法
  8. 标题: Excel地址 Excel单元格的地址表示很有趣,它使用字母来表示列号。 比如, A表示第1列, B表示第2列, Z表示第26列, AA表示第27列, AB表示第28列, BA表示第53列
  9. CLUSTERDOWN Hash slot not served
  10. PID控制电机输出作为电机PWM占空比输入的理解
  11. 密歇根州立大学联合京东提出深度强化学习算法DeepPage用于分页推荐
  12. ACM程序设计之马拉松竞赛
  13. 计算机路由器上网配置,电脑如何设置路由器上网?
  14. SAP系统销售流程成本和收入的确认
  15. 关于Ng-alain的Acl的使用
  16. 小米6MIUI稳定版安装谷歌相机
  17. 郑州计算机五年大专学校排名,2021年河南十大专科学校排名 河南最好的高职院校...
  18. MapReduce解决乘用车辆和商用车辆的销售数据分析
  19. 【推荐】mysql联合 索引(复合索引)的探讨
  20. 《俊红的数据分析之路》笔记

热门文章

  1. AC日记——积木大赛 洛谷 P1969
  2. mbed列--基于飞思卡尔FRDM KL25Z鼠标设计的高速实现
  3. 在学生课堂作业作品发布之前的话
  4. 综合布线施工中的不规范现象
  5. photoshop修复面部的皱纹
  6. GDI+ 中发生一般性错误(生成验证码时出现的错误)
  7. Deformable ConvNets--Part2: Spatial Transfomer Networks(STN)
  8. ASP.NET MVC 1.0 转化为ASP.NET MVC 2.0的方法
  9. 反汇编的应用1-软件破解
  10. SAP Business One 产品功能综述