前言

  首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不是最好思想的mvp.还有以下总结的mvp都是使用最简单的mvp模式说明,不是其他大神那种一个类放M/V/P3个内部类(个人不喜欢这种模式),也不是需要各种继承的mvp模式.

MVP

  分别是:

  Model

  View

  Presenter

MVP该从哪里开始?

  思维顺序

  个人建议书写顺序是,m>v>p.至于为什么下面讲解:

  1.   M  M层需要实现数据的获取,它的耦合是最低的一个层类,所以放到最前面来书写,会有很少的停顿.(不必在方法里调用其他层的东西)
  2.   V   V层是负责展现数据的层,它的书写顺序是第二个,为什么?因为它的耦合有,但是也不多.所以放到第二个写正合适
  3.   P   P层是负责组装数据的层,他有大量耦合,需要大量的调用V的添加数据的方法,和M层获取数据的方法.所以只有上面2个层完成后,我们才能很顺畅的写出P层,所以理所应当的把P层放到最后来书写.

  实际创建

  上面只是说明了书写顺序,当是实际上mvp是6个类(3个接口类,3个实现类)的模块,所以我们需要了解MVP真正6个类应该以一个怎么样的思维分别去按顺序创建他们.

  1.   先将3个MVP的接口类所有需要实现的接口方法全部写完整.(M层接口类要干那些网络获取数据的方法,V层要干那些添加数据的方法,P层要干那些组合和调用M层的方法)
  2.   以上3个接口类全部书写完毕后,在分别创建3个MVP层类,接口他们各种的层级,然后在开始按mvp顺序实现各个接口方法.
  3.   当然如果M层是网络请求,那就需要考虑异步的问题,这个时候还要增加一个接口类负责M层和P层的数据异步(当然这个接口类可以在全部MVP下共用)

MVP各自界限

  已开始写MVP的时候,非常容易把mvp的各种界限搞混,写着写着就容易把P层的逻辑写到V层上,导致P层变成一个衔接反而啥都没做,这很正常.因为开发Android App本身在使用MVP开发上会或多或少的有些模糊,跟web端的mvp多多少少有些不同.下面我们就来说一下Android开发mvp的各自界限

  M层的界限

    1.首先切记M层不能持有任何其他层的实例,因为它不需要调用其他2个层

    2.只书写需要使用的网络请求操作(请求网络/暂停网络请求/销毁网络请求),不写任何的数据处理逻辑,数据只返回给P层做判断组装

    3.不拦截处理网络报错和异常,所有网络报错和异常统统交给上一层P层去判断

    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();//销毁
}

  P层的界限

    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();//销毁
}

    

  V层的界限

    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模式差不多就完美了.

Android开发 MVP模式的规范记录(个人总结)的更多相关文章

  1. Android开发MVP模式解析

    http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...

  2. ym——Android开发MVP模式(攻克了View和Model的耦合)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 什么是MVP呢?它又和我们经常听到的MVC有什么关系了以及差别呢? MVP 是从经典的 ...

  3. android开发-mvp模式理解

    看之前,先忘掉所有,一步步看就行了. 最后会有一个原型demo,当然是转的了.看完文章,再看demo,然后再回头看文章就很好理解了,最好自己写一遍. 1.mvp开发模式可以理解为页面接口编程,每一层的 ...

  4. Android开发技术周报182学习记录

    Android开发技术周报182学习记录 教程 App安全二三事 记录 为什么要安全 App的移动安全主要包括下面几种: 密钥破解,导致本地加密数据被盗取. 通信密钥破解,导致接口数据被盗取. 伪造接 ...

  5. android的MVP模式

    MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...

  6. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  7. Android开发技术周报183学习记录

    Android开发技术周报183学习记录 教程 Android性能优化来龙去脉总结 记录 一.性能问题常见 内存泄漏.频繁GC.耗电问题.OOM问题. 二.导致性能问题的原因 1.人为在ui线程中做了 ...

  8. (未完成)【Android】MVP模式初见(一)

    最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意. 虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近.因此接下来一段时间,主要学习一下MVP架构.Retrofit以及RxJav ...

  9. 说说Android的MVP模式

    http://toughcoder.NET/blog/2015/11/29/understanding-Android-mvp-pattern/ 安卓应用开发是一个看似容易,实则很难的一门苦活儿.上手 ...

随机推荐

  1. 64位ubuntu16.04系统安装网易云音乐

    64位ubuntu16.04系统安装网易云音乐 1.官网下载安装包:netease-cloud-music_1.1.0_amd64_ubuntu.deb https://music.163.com/# ...

  2. scss初学小结(转阮一峰老师SASS用法指南http://www.ruanyifeng.com/blog/2012/06/sass.html)

    1.安装 SASS是Ruby语言写的,但是两者的语法没有关系.不懂Ruby,照样使用.只是必须先安装Ruby,然后再安装SASS. 假定你已经安装好了Ruby,接着在命令行输入下面的命令: gem i ...

  3. java 你画我猜 了解一下

    0-设计思路: 你画我猜顾名思义,有一个人画,一个人猜,两个思路: 1)一个中央服务器,中转数据,两个client端:,a画对应点的数据通过服务器发给客户端b,b通过这些数据进行绘画,换颜色人,等等, ...

  4. 通过junit写unit test

    how to run test within junit & mvn: During team development , there are more than 1 person edit ...

  5. 经典问题----拓扑排序(HDU2647)

    题目简介:有个工厂的老板给工人发奖金,每人基础都是888,工人们有自己的想法,如:a 工人想要比 b 工人的奖金高,老板想要使花的钱最少 那么就可以 给b 888,给a 889 ,但是如果在此基础上, ...

  6. redis配置文件说明

    redis.conf 配置项说明如下: Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 当Redis以守护进程方式运行时,Redis默认 ...

  7. day-12函数对象

    函数默认值的细节 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值,后面变化不会再变化 a = 100 def fn(num=a): a = 200 fn() 三元 ...

  8. Java面试问题汇总

    转一些面试经验 刚看到下面这份面试清单,从个人的开发面试经历看,里面总结的大部分内容还是很不错的.年后想跳槽的朋友可以选取里面的问题准备一下. GitHub上的面试总结帖 Interview-Note ...

  9. VirtualApk 插件入门小试

    1 官方资料 滴滴开源Android插件方案:VirtualAPK 2 宿主App集成方法 (1)在整个工程的build.gradle中添加依赖 dependencies { classpath 'c ...

  10. vs2017 F5不会自动编译了

    其实我的错误提示是:c# 不会命中断点 源代码与原始版本不同 我在网上搜索这个,发现让另存啦.格式化代码啦.批量重生成啦. 只有批量重生成好用,断点能打上,其他方法都不行. 可是每次都批量重生成太麻烦 ...