谷歌官方MVP框架源码解析之 TODO-MVP

      这段时间在了解MVP的框架 网上也有一些示例写的也很好 正巧看到官方也推出了基于MVP的示例Demo 所以想试着了解下 顺便写下此笔记

     其实网上也已经有对MVP进行了解析的文章Android官方MVP架构示例项目解析说的也很好 但是关于M方面不是很理解 所以自己试着解析下


      先上一张图MVP的结构图


MVP


     什么是MVP ? 为什么使用MVP 他有什么优缺点 ? 这里我就不赘述了  这篇文章已经都说到了想更多的是解释示例MVP的代码

官方给出的示例MVP流程图


MVP


现在看着可能似懂非懂 这样我们先 Read the fucking source code 再回来看图!


 项目在GitHub上面有 我是地址

先看下目录结构


目录结构

可以看出分包是根据模块进行的分包  

基类

 首先是View 和 Presenter 的基类  定义start setPresenter 方法 什么作用下面说


Presenter


View

接下来是Model 这个可能跟View 的基类什么的还不是太一样 因为接下来的所有的Presenter都用同时用到它

Model


这里面谷歌还弄了一个叫做契约类的东东  是一个接口 定义内部接口继承View 和Persenter基类

定义方法 到时候V 和 P 直接实现这里面的接口就可以了 并且有什么方法都会在这里 确实是看方法的时候简洁明了

Contract

那么下面我们就开始

首先是进入主TasksActivity 我们只看主要代码其他初始化控件什么的就不看了

可以看到 onCreate方法里面 显示直接创建TasksFragment对象 并且添加到了Activity

并且TasksFragment 是直接实现的契约类的TasksContract.View基类

接下来创建TasksPresenter对象 并且传入了TasksFragment对象和 Model对象 这里的Model先这么记得 因为它里面并不是那么简单


小总结:

1实现类并不是直接实现的基类 而是创建了一个契约类来实现 来更好的管理实现类中的方法

2 这里面的Activity并不是我们MVP中对应的V 而是Fragment Activity只是负责管理创建 V P M 的对象使他们相互关联 从而达到相互调用


既然TasksFragment 和 TasksPresenter 对象都已经创建了 我们就进去看看里面是怎么实现的

TasksPresenter

   实现TasksContract.Presenter契约类接口 在构造里面接受 Model 和 View 的对象,并且调用了View 的setPresenter方法 并且把自己的引用传了进去 这就是上面基类定义的方法,这样Presenter就有了View的引用 View也有了Presenter的引用。

    还可以看到下面 实现了start方法 并且调用了 loadTasks方法 这个方法其实是用来加载数据使用的 一会在说是谁调用他的 和他的调用时机。

TasksFragment

 我们在回头看TasksFragment的实现

  创建对象  可以看到onResume方法里面调用了Presenter的start方法 就是当界面可见并且运行起来的时候 调用start方法 在调用刚才上面说的loadTasks加载数据

还可以看到我们实现的setPresenter 接受了Persneter引用


小总结:

1 Presenter 拿到View引用  调用setPresenter传入自己的引用, View在拿到Presenter引用 在生命周期方法onResume中调用start方法加载数据


接下来我们在看loadTasks方法的实现 因为屏幕小截图不够一张 原谅我多截几张(手动调皮脸)


调用了TasksRepository的getTasks 方法 那么现在我们就要说一下这个TasksRepository的引用是怎么回事了

还记得刚开始的时候 我们通过构造传入进来的TasksRepository对象是怎么生成的么

其实是调用了上面这个的类的方法  并在再返回的时候 创建了 TasksRepository 的对象 并传入了  FakeTasksRemoteDataSource 和 TasksLocalDataSource 的引用 才返回的 那么我们进入去看看  这个里面引用到底是什么  搞清了他 一会我们在看getTasks 方法的时候才能看懂

再看下Data的目录结构

可以看到 这两个引用 和我们的Model对象都是实现了 我们刚开始定义的Model基类 现在可以说明的一点就是这几个类都是提供数据的 并且这些类都实现了 getTask方法

FakeTasksRemoteDataSource

类描述 :Implementation of a remote data source with static access to the data for easy testing.    大概的意思就是 用来实现静态的远程数据访问测试

哦 跟咱们猜的差不多 提供数据的  但是他是提供远程数据源的  也就是模拟我们在网上获取数据的  只是获取数据的一种方式

getTask方法  从一个Map中获取数据

TasksLocalDataSource

类描述:Concrete implementation of a data source as a db.

哦  又猜的一样  是一个基于数据库的数据源  又是一种获取数据的方法

这里面的getTask也是一样获取数据 代码太多 就不贴了


那么我们现在搞明白了这两个引用分别都是以不同方式来模拟获取数据的 并且还传入到了TasksRepository中 那这时候我们就来看看TasksRepository的getTask是怎么实现的


接受LoadTasksCallback 对象 这个其实是刚开始声明在Model基类中的 内部接口

声明了两个方法  其实就相当于我们的 请求数据成功和失败一样

然后判断缓存是否存在 和缓存是否可用  如果都可用 那么回掉接口方法 并且把缓存的数据全部取出来返回

然后判断缓存是否可用 不可用 调用getTasksFromRemoteDataSource 方法

可以看到里面调用了 上面我们传入给TasksRepository中的 远程数据获取的引用 并且调用了getTask方法 获取数据  如果获取成功 添加缓存 并且添加本地 在回掉成功 传入数据

如果可用 会调用获取 本地数据源引用的getTask方法 加载数据 成功的话在添加到缓存 然后成功回掉

这时候 我们看他会调成功后 循环 根据任务类型进行添加数据 最后调用 processTasks 方法 传入数据 如果数据没问题 就调用TasksFragment的showTasks方法 展示数据

到此为止 这个流程就是走完了

  这时候 我们在来看看 上面官方给出的图 右边 首先是由Activity管理 View也就是Fragment  和Presenter 的创建和关联  然后再让Model和 Perstnter相互引用

  左边 可以看到Model本身有缓存机制  并且分别创建了 本地数据源 和远程数据源

最后其实官方的示例中还涉及到了测设部分 因为不太了解 就不做重点了解了 

其实官方给我们 只是一种示例 我们不一定非要用Framgent当View  也不一定非要把Model写成这种模式 但是这种方法感觉也还是值得借鉴的  我们也可以根据我们项目的自身需求 来编写不同写法 希望大家不要被具体的代码所困住



      本篇到此就结束了  总的来说代码还是很简单的 不过还是要多多使用才能更加深刻的理解MVP 好了 希望大家不喜勿喷 有错误的地方还请多指教 再见  !

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容