MVP模式讲了很久了,自己实际中也运用过,但总觉得运用的不够优雅跟简洁。这次终于等到官方出MVP的例子了,有了一个借鉴模仿的模板todomvp系列。这次先来讲一下todomvp的基础版。


todomvp代码可以分为两块
一块是公共类和基类:

一块是具体页面的实现类,比如:

先分析公共部分:

BasePresenter和BaseView很简单,主要还是作为P和V的一个类型标记作用:

public interface BasePresenter {void start();}public interface BaseView<T> {void setPresenter(T presenter);}

剩下的四个类中,UseCase(包含UseCaseCallback接口)和UseCaseHandler是直接提供给开发者使用的类。UseCase、UseCaseCallback相当于一个任务和一个任务的回调,而UseCaseHandler起到一个分发处理任务的入口,它实际代理了UseCaseScheduler类,最终任务的执行还是交由UseCaseScheduler的实现类UseCaseThreadPoolScheduler。
来看一下执行任务相关类的类图:

主要由UseCaseHandler作为一个代理类,将任务UseCase交给UseCaseScheduler处理,UseCase自身任务执行完成后,通过持有的UiCallbackWrapper对象通知到UseCaseHandler,再由UseCaseHandler通知真正的处理者UseCaseScheduler执行回调。
(其中UiCallbackWrapper只是UseCaseCallback的一个简单实现,持有回调对象和UseCaseHandler对象,理解过程中可以忽略)
UseCase打头的四个类定义处理具体逻辑任务的框架,承担M层的作用。

再看具体页面的MVP应用:

其中
TaskDetailFragment作为V的职责
TaskDetailPresenter承担P的工作
TaskDetailContract是对于TaskDetailFragment、TaskDetailPresent的方法的一个统一定义接口
TaskDetailActivity是创建和连接V、P的总控制器

这里其实TaskDetailFragment可以算多余的,让TaskDetailActivity来直接承担V的工作也是可以的。但多出一个Fragment会显得更加灵活,在多设备的适配上也更方面。举个例子,在实际项目开发中,我遇到一个界面的布局与逻辑,我会有意识的去分拆成几块地方,分别用Fragment来实现,Activity的作用只是把几个Fragment按顺序添加进来,然后碰到产品经理设计师对界面重新布局与逻辑块的删除或重排序或新增页面需复用部分块时,,我仅需要对Fragment单个整体来操作即可,,轻松快速的完成了产品不可控的需求变更。(也是被产品随意变更需求和设计师页面的变动逼的木有办法想到的法子···)

TaskDetailFragment与TaskDetailPresenter分别实现TaskDetailContract中预先定义的方法,,TaskDetailFragment中仅实现与UI有关的工作,其它非UI逻辑操作均放置于TaskDetailPresenter中。因为V、P之间是互相持有对象的,所以逻辑处理完成通知UI层,UI层又能触发逻辑层的方法执行。
贴一下其中一个事件的触发执行的闭环代码:

    //V层触发@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_delete:mPresenter.deleteTask();return true;}return false;}//P层开始处理@Overridepublic void deleteTask() {mUseCaseHandler.execute(mDeleteTask, new DeleteTask.RequestValues(mTaskId),new UseCase.UseCaseCallback<DeleteTask.ResponseValue>() {@Overridepublic void onSuccess(DeleteTask.ResponseValue response) {//回调到V层mTaskDetailView.showTaskDeleted();}@Overridepublic void onError() {// Show error, log, etc.}});//V层回调显示UI变动,这里直接是退出了页面@Overridepublic void showTaskDeleted() {getActivity().finish();}

整体来说,todomvp的结构是很清晰简洁的,MVP方面的运用相差无几,其中靓点在于V、P方法的统一预定义,与Activity的弱化、Fragment承担V的职责。

todomvp 谷歌的MVP实例相关推荐

  1. 谷歌官方MVP例子分析

    官方给出了四种MVP架构模式: 1.todo-mvp:MVP基础架构 2.todo-mvp-loaders:基于MVP基础架构,获取数据部分使用了Loaders架构 3.todo-mvp-databi ...

  2. 将谷歌云linux实例转为Windows实例

    将谷歌云linux实例转为Windows实例 想用谷歌云搭建英灵神殿的服务器,但是不熟悉Linux,所以把它转换成Windows实例. 使用SSH连接进入root模式 sudo -i 安装wegat ...

  3. 转吴小龙的 mvp Android MVP 实例

    转吴小龙的 mvp Android MVP 实例 详情点此http://wuxiaolong.me/2015/09/23/AndroidMVPSample/

  4. 用python画梵高星空-谷歌AI:推进实例级别识别 (ILR)研究

    本文由Cam Askew and André Araujo,Software Engineers, Google Research发布. 实例级识别(ILR)是识别一个物体的特定实例而不是简单识别出所 ...

  5. mac连接手机 vm_使用mac ssh连接谷歌云vm实例

    谷歌云上提供了在线操作云节点的shell,但是毕竟不如本地多年操作的shell用起来爽,因此,本文以mac iTerm为例,记录一下本地连接谷歌云的操作过程和遇到的问题. 1.谷歌云提供的在线shel ...

  6. 吴小龙的 mvp Android MVP 实例

    http://wuxiaolong.me/2015/09/23/AndroidMVPSample/ https://github.com/WuXiaolong/AndroidMVPSample

  7. 如何更高效的使用MVP以及官方MVP架构解析

    转载请标明出处: http://blog.csdn.net/dantestones/article/details/51445208 Android mvp 架构的自述中我简单的介绍了mvp,以及怎么 ...

  8. google官方mvp+dagger2架构详解

    原文链接:http://www.jianshu.com/p/01d3c014b0b1 1 前言 前段时间分享了一篇文章:google官方架构MVP解析与实战 ,针对这是对google官方示例架构的一个 ...

  9. 一款基于Kotlin+MVP+组件化的麻雀App(文末有彩蛋)

    热文导读 | 点击标题阅读 金九银十跳槽季如何进阶找到合适满意的工作? 美团面试失败(Java开发) 程序员年度总结:2019年,你的出路在哪? 作者:CysionLiu (源码下载地址见文末) 来源 ...

最新文章

  1. 导入导出Android手机文件
  2. DPDK uio驱动实现(二十)
  3. NiFi 脚本执行器使用指南 (part 3)
  4. linux下的DNS服务器详解
  5. 全球最伟大社交软件!微信入选“现代百大设计最佳产品”:排名超Facebook
  6. 多媒体方面的应用程序java_Java编程之多媒体基础
  7. c语言存储的逻辑顺序,栈是不是顺序储存的线性结构啊?
  8. NLog自定义字段写入数据库表,示例
  9. Linux 命令(71)—— ldconfig 命令
  10. python类:类方法和静态方法
  11. Word VBA 绘制直尺
  12. 模糊C均值聚类算法及实现
  13. 触动精灵 PLIST 文件读取 详解
  14. linux centos7 apache+mariadb+php 虚拟机vmware workstation lamp环境搭建
  15. 四川企立方:拼多多团购要怎么申请团购点
  16. 优盘里面的文件夹变0字节也打不开文件的解决方法
  17. 指数基金定投指南 思维导图
  18. Pc端扫码登入步骤解析
  19. 猫扑视频未被处罚,此猫扑非彼猫扑
  20. java 注解 框架_深入浅析Java注解框架

热门文章

  1. 小学计算机笔记,小学信息技术教师读书笔记
  2. nc65语义模型设计_完整word版,NC数据加工做语义模型
  3. matlab画平行坐标轴的直线
  4. vue避免重新渲染_小白也能懂的VUE的生命周期探寻
  5. 使用ConcurrentHashMap一定线程安全?
  6. 30、【华为HCIE-Storage】--Hyper Metro(双活【块业务】)
  7. H3C V7 AC https页面无法重定向问题处理经验总结
  8. runtime objc_msgSend
  9. DFS分布式文件系统 不同用户访问不同服务器修改同一文件 解决方案
  10. [Vim 使用]vim 自动括号补全配置