Android官方MVP示例学习分析

来源:互联网 发布:最新的网络流行词 编辑:程序博客网 时间:2024/05/18 00:19

MVP设计模式

  • Model-view-presenter (MVP) 是使用者界面设计模式的一种,被广范用于便捷自动化单元测试和在呈现逻辑中改良分离关注点(separation of concerns)。
  • Model定义使用者界面所需要被显示的资料模型,一个模型包含着相关的业务逻辑。
  • View视图为呈现使用者界面的终端,用以表现来自 Model 的资料,和使用者命令路由再经过 Presenter 对事件处理后的资料。
  • Presenter包含着元件的事件处理,负责检索 Model 取得资料,和将取得的资料经过格式转换与 View 进行沟通。
MVP具体概念可以参见我的另一篇学习博客:图解MVC,MVP与MVVM,里面详细谈了MVC,MVP与MVVM的相关概念,此处不做进一步介绍。

官方项目运行

下载解压完后,可以得到这样的一个项目,直接用android studio打开项目即可:


  • 我们先来编译运行一次,对项目有个整体印象:

    • 打开后显示的是to-do-list,即是任务列表:


    • 右下为添加新任务,下图为添加信息和添加后的结果:




    • 打开左上角菜单,出现侧边栏,第一个是首页所见的to-do-list,第二个是统计任务Statistics:






    • 右上角有两个选项,分为右数第一个(右1)和右数第二个(右2),右1功能为清除完成任务和刷新,如下图:


    • 右2功能为筛选任务,分为所有任务,尚未完成和已经完成三种,如下图:


项目结构

  在看完项目的运行效果,我们大概知道了项目实现了什么功能,下面看一下项目的结构。


  • 可以简单看出来项目分成几个部分:
    • addedittask编辑任务功能
    • statistics统计功能
    • taskdetail任务详情功能
    • tasks任务显示功能
    • data数据处理
    • util工具
    • BasePresenter,BaseView两个接口
  • 我们进一步看具体代码的实现,如下图所示:

    • 两个Base接口:BaseView中含有setPresenter的方法,用于构造时传入presenter。BasePresenter中含有Start的方法,用于获取数据并且改变view界面:




    • 可以从结构上看出,每一个功能都是用Activity,Contract,Fragment和Presenter四部分去实现的。


  • 进一步研究Activity,Contract,Fragment和Presenter四部分,以taskdetail为例(这个功能的逻辑较简单,容易从中看出其机制)如下所示:

    • Activity所做的事情就是创建了View(Fragment用以显示内容,即MVP中模式的View)和Presenter:创建fragment实例,再将fragment传给presenter,使得presenter中可以调用fragment。


    • Contract这个类很有趣,之前在别的MVP模式中没有见过单独分一个统一接口出去。官方的MVP模式中加入了contract用于同一管理view跟presenter的所有接口。这种做法方便管理维护view跟presenter的接口。view跟presenter继承自前面提到的BaseView和BasePresenter,代码如下:




    • Fragment中实现的内容很多,包括了各类数据的显示,但其中大部分都是简单的UI处理,如setText等操作。而业务逻辑则通过调用presenter,在presenter中实现。
      特别地,上面提到BasePresenter中的Start函数,会在Fragment的OnResume函数中被调用,以获取数据:





    • Presenter在被Fragment调用以后,开始其业务逻辑处理的工作,再将结果显示在Fragment上。以上面Fragment中的editTask为例,在被调用后,Presenter中进行逻辑处理,决定显示什么内容(showMissingTask或者showEditTask),从而调用Fragment中的函数。而Fragment则通过被调用的函数显示UI效果。
      特别地,上面提到BaseView中的setPresenter函数会在构造函数中被调用:




  • 通过Activity,ContractFragmentPresenter四个部分我们大致上理解了ViewPresenter之间的通信实现。而Model则是实现了数据的增删查改,当Presenter中调用时,Model进行对数据的处理,然后将处理结果返回给Presenter,实现二者之间的通信,大体实现代码如下:


总结

  在通过上面的代码理解了MVP模式后,我们最后用一个小例子来进行应用,巩固印象:

  • 在MVP模式中删除数据:
    • 用户点击删除
    • View收到请求,调用Presenter处理逻辑
    • Presenter处理逻辑,调用Model进行数据删除
    • Model删除完毕,反馈给Presenter
    • Presenter收到反馈,调用View显示删除完毕信息
  • 图解如下:


      至此,我们通过对官方提供的简单MVP架构中一个例子的分析,了解了MVP架构的工作原理。
      MVP实现了View,Presenter和Model的分离,使得三个部分各司其职,大大提高了代码的可测试性,可维护性和可拓展性,在实际代码项目中有着很重要的意义。

代码来源见:官方项目地址
本文参考博客见:参考博客1&参考博客2
相关概念参考:文中MVP模式简介