转载请说明出处 http://www.jianshu.com/p/bbbff64486e5
该工程是谷歌官方推荐学习MVP应该熟悉的项目Github官方地址
看下Gif吧,从视觉上感受下。
声明:本文提供的图片,为防止有人感觉不适,部分地方打码 :-)
项目本身做的事情非常简单,四大模块,添加任务,任务列表,任务详情,统计列表。但该项目写的非常标准,并且我看到了很多好玩的东西,开发者需要熟练掌握,想学好这几个方面还得下足功夫。我会单独标注,整体包结构(示意图标注直观清晰表达):
Model : 所属包 data
View : 所属为每个功能模块包。 (我们通常会这样创建包结构,比如这里添加任务模块,里面就包含了以Fragment做为的View)
Presenter: 亦所属功能模块包。
再提一次,该工程有四大功能
addTask 添加任务
Tasks 任务列表
TaskDetail 任务详情
Statistics 任务统计
我之所以打开AddTask,是因为展示View和Presenter这个结构最纯粹,最具代表性。再来熟悉一下MVP 原文地址
View与Presenter可以双向通信,协议是Interface实现,以Contract命名结尾的。比如AddTask包下的 AddTaskContract
AddTaskActivity是创建Fragment与Presenter的。用Fragment做为View(Activity也可以)是因为更加纯粹,有时我们也不用严格去这么做。
AddTaskPresenter是控制器。
我们首先学会了通过类名来区分每个角色,这样学习其他功能,比如任务列表,任务详情,统计信息模块,是完全一样的。看下图:
AddTaskContract 协议,定义View与Model的需求、功能,来看
好处是功能清晰,维护简单,方便管理
继续看下一般结构
好了,View与Presenter讲清楚了,现在开始讲Model。Model略微复杂,你看看嘛
我所理解的Model不仅对外提供数据,并且定义数据类型。
Task : 任务实体类
TasksDataSource: 是Model与对外暴露的协议,让他人知道Model可以提供哪些功能
TaskRepository: 真正实现TaskDataSource接口的类。来看张类图
具体做的工作分给 TaskLocalDataSource 与 TaskRemoteDataSource
local 本地数据源,SQLiteDB形式。
TaskDbHelper : 看后缀DbHelper肯定是帮助类,用于记录的增删改查的
TaskLocalDataSource : 具体提供Model功能
TasksPersistenceContract:定义DB中一些常量,如表字段 如图
Remote为远程数据源
TaskRemoteDataSource: 模拟network提供数据源
OK,截至到现在,该工程的MVP角色我都讲了,源码具体实现,感兴趣的可以去官网下载。本人也大概浏览了一下,翻译了一些注释。无奈没找到简书上传文件功能,无法分享了。如果真的很需要请入Q群并注明 473930845 最纯粹的技术交流群体
util : 工具箱
BasePrsenter : 基础Presenter,只有一个方法start(),并且这个方法是在Fragment的onResume()中调用的,其实就一个作用,告诉Presenter,Fragment开始工作了,View对用户可以见了, 你可以做一些业务动作了。所以,我们也可以灵活的根据需求,当Fragment对用户不可见时,通知Presenter。
BaseView :只有一个方法 setPresenter(T presenter) 看名字就知道了,拿到Presenter引用,用于 V - > P 的指令
那么如果 p -> V 的指令想要发送, 一定是Presenter拿到View的引用,怎么拿?“创建Presenter的时候把当前View传递过去” 简单暴力。 看代码
Activity作为View与Presenter的管理者,很适合这个工作。但我看过很多MVP工程,包括我自己的,把Activity作为View
好的,到目前为止,整个项目的架构讲解完成,做到了先整体再局部。
接下来我们看一些有意思的实现(这可是GoogleSample)值得借鉴的,我会放在另外几篇文章中,因为具有通用性
1. MVP好在于分层测试,这个项目中有单元测试,UI测试。基于本项目学习下
2. .gradle脚本的配置 技巧。 基于本项目学习下
完结