QQ群:AndroidMVP 555343041

更新日志:

2017/1/31:AOP新增SysPermissionAspect支持动态申请系统权限切片,轻松适配6.0+

2017/1/27:AOP新增DbRealmAspect支持Realm数据库,数据库突破你想像的简单(年夜特供)

2017/1/8: 使用Apt封装Retrofit生成ApiFactory替换掉所有的Repository,狂删代码

2017/1/7: 使用DataBinding替换掉所有的ButterKnife,狂删代码

2017/1/6: 使用DataBinding替换掉所有的ViewHolder,狂删代码,从此迈向新时代

2016/12/30:新增TRouter全局路由,使用apt生成代码实现页面跳转

2016/12/29:去掉BaseMultiVH新增VHClassSelector支持更完美的多ViewHolder

2016/12/28:使用Apt生成全局的ApiFactory替代所有的Model

2016/12/27:增加了BaseMultiVH扩展支持多类型的ViewHolder

2016/12/26:抽离CoreAdapterPresenter优化TRecyclerView

全局路由TRouter,更优雅的页面跳转

加入OkBus,实现注解传递事件

1、去掉所有反射>2、新增apt初始化工厂,替换掉了dagger2。>3、新增aop切片,处理缓存和日志

导语

删繁就简三秋树,领异标新二月花

传统MVP给人的第一感觉通常是接口和类的暴涨,将Activity中除V之外的繁杂操作搬到P之后依然臃肿不堪。MVP从来都不是救命稻草,只能锦上添花,不能雪中送炭。也许在权衡利弊之后,很多人会对MVP望而却步。 现在 我们换一个思路,取其精华,去其糟粕,完成T-MVP大变身。

一、T-MVP简介

话不多说,先上图:

T-MVP架构图

下面,看看如何利用泛型把我们从繁杂重复的劳动中解救出来。

后台接口用的是LeanCloud的REST API,数据通过Node爬虫从网页上获取,先爬出十个页面的列表,然后每一个列表爬进去获取文章详情。爬虫代码见app.js。(建议替换成自己申请的appId和appKey)。

1、页面分层结构

宗旨:纯粹界面操作交互,不需要MP参与的行为,尽量V自己做,保证MVP职责清晰,P只有干净简洁的协助VM的业务逻辑操作,M只处理数据操作。

登录契约类

相比谷歌官方Contract类,多了一个Model,用于将P中繁杂的数据操作分离解耦,让P层变得简洁明了,只处理M和V相关操作即可,登录Present的全部代码:

登录Present的全部代码

RxManage用于管理订阅者、观察者、以及事件。(详见代码)

例如:

发送事件: mRxManage.post(C.EVENT_LOGIN, user);

接收事件:mRxManage.on(C.EVENT_LOGIN, arg ->mView.initUserInfo((_User) arg));

LoginModel的全部代码:

LoginModel的全部代码

抽离出Model不仅各层更加分工明确便于Model的复用,而且大大简化了Presenter的代码量,让P层更简洁更专注。职能清爽,一目了然。

2、列表页

例如一个列表页,用户关心的,只有列表的Item展示:

mTRecyclerView.setItemView(ItemView.class);

不需要在当前页面写网络请求,不需要写下拉刷新和分页加载更多的回调,不需要写任何Adapter,只需要这一句即可。因为用泛型在TRecyclerView里面写过抽象层的操作,将监听和数据的获取封装成通用模板,从此可以一劳永逸了。

比如,分页加载的封装操作:

TRecyclerView部分代码

对于有HeaderView的List也一样:

mTRecyclerView.setHeaderView(HeaderView.class).setItemView(ItemView.class);

ViewHolder也是相当简洁的写法:

ViewHolder

至此,项目可以永远告别OnRefresh ,onLoadMore ,Adapter。

3、项目结构

T-MVP利用泛型解藕和高度抽象封装之后,相较于传统MVC和MVP代码量大大精简,架构的代码量也是精简至极:

例如BasePresenter的全部代码:

BasePresenter的全部代码

二、T-MVP的目标

//TODO

1 整理Base类,吸纳意见之后,继续优化封装,将简洁进行到底。让MVP不再背负繁杂的名声。

2 发布到github

3 争取发布到jcenter

正在做:

1 添加持久层数据存储realm

2 recyclerview支持多种LayoutManager (GridLayoutManager StaggeredGridLayoutManager),支持多头部,多列表类型,多底部。

3 添加fragment的MVP,同时也解决了一个页面需要多个P的问题

4 尽量把反射去掉,免得有人抓住把柄说性能不好

5 把框架部分隔离出来,单独做成Library

6 用apt自动帮我们生成一些黑科技代码,达到事半功倍的效果

三、进度

1登录、注册

2列表分类

3文章详情 文章评论列表

4用户中心 用户评论列表

5更换头像

6用户列表

项目截图:

7247fc46jw1f3p5r5tsynj20u01hcwl0.jpg

7247fc46jw1f3p5r8cjjhj20u01hc47t.jpg

7247fc46jw1f3p5r35jqnj20u01hcdt4.jpg

7247fc46jw1f3p5rceufqj20u01hcnaz.jpg

java 泛型解耦,T-MVP:泛型深度解耦下的MVP大瘦身相关推荐

  1. Java使用简单工厂模式对面向接口编程模式的深度解耦实现

    在Java和C#的编程世界里,并没有出现像C++那样的多脉继承,它们只支持单一的继承,或者多级继承,这一变化最大的影响,我觉得是大大的降低了编程的难度,因为没有了C++的多级多脉继承,所以接口出现了, ...

  2. java中什么泛型_java中的泛型(一)

    在java中我们定义接口其实定义的是这个类的功能,在很多时候我们并不关心这个类的类型而是这个类的能力.泛型的出现让我们的代码和代码所能操作的类型不在绑定在一起,不仅可以复用代码降低耦合还可以提高代码的 ...

  3. 二、Java 面向对象高级——Collection、泛型

    day02[Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合 ...

  4. java day13【Collection、泛型】

    第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合:集合是java中提供的一种容器,可以用来 ...

  5. Java泛型进阶 - 如何取出泛型类型参数

    在JDK5引入了泛型特性之后,她迅速地成为Java编程中不可或缺的元素.然而,就跟泛型乍一看似乎非常容易一样,许多开发者也非常容易就迷失在这项特性里. 多数Java开发者都会注意到Java编译器的类型 ...

  6. java 接口的泛型方法_Java泛型/泛型方法/通配符/泛型接口/泛型泛型擦出

    从JDK1.5以后引入了三大常用新特性:泛型.枚举(enum).注解(Annotation).其中JDK1.5中泛型是一件非常重要的实现技术,它可以帮助我们解决程序的参数转换问题.本文为大家详细介绍一 ...

  7. Java编程的逻辑 (36) - 泛型 (中) - 解析通配符

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  8. java 泛型集合应用_Java泛型集合的应用和方法

    展开全部 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以62616964757a686964616fe78988e69d8331333 ...

  9. Java 为什么不支持创建泛型化数组

    没事的时候在书中翻了下泛型相关的知识,注意到一个比较有意思的问题:Java 不能创建泛型化数组.比如像下面这样就是不允许的: // 创建一个泛型类 public class Generic<T& ...

最新文章

  1. Linux查找文件 —— whereis 、 find、 locate、 which
  2. 微服务实践分享(3)服务发现
  3. C指针原理(42)-内存管理与控制
  4. 「禾连健康」轻松实现弹性降本20%以上,竟然是因为使用了它!
  5. Qt4.7.0添加自定义键盘(转载+部分自己的实际工程实验)
  6. android 系统之ContentProvider
  7. 这种动作片还需要汽车特效?
  8. windows 检查cuda安装_Windows云主机GPU驱动-CUDA安装使用
  9. C#使用Monitor类、Lock和Mutex类进行多线程同步
  10. 多字节编码与Unicode码的区别 内码
  11. php 调用speex解码库,android 用speex做回音消除
  12. 史上最简单的 GitHub 教程
  13. uni-app保存图片到本地相册
  14. 【Python】阿里云对象存储OSS图床上传图片
  15. 基于html5手机移动端对话框特效
  16. 地理空间数据格式——OGC-GML
  17. java jsp eq_javaWeb核心技术第九篇之JSP
  18. AR眼镜走向独立,从一个配件开始
  19. python新手爬虫练习(二)-编码
  20. Unity的新动画系统(animator)在脚本中的操控

热门文章

  1. R 语言关于 SSL 证书异常处理笔记
  2. 中科院分子细胞中心、清华大学和Bio-protocol联手发布《高通量筛选实验手册》...
  3. 生信和植物领域最新资讯合集
  4. 看了Linux命令的全称,顿时豁然开朗
  5. Python使用numpy包编写自定义函数计算平均绝对误差(MAE、Mean Absolute Error)、评估回归模型和时间序列模型、解读MAE
  6. matplotlib可视化时间序列数据、并高亮时间序列中的指定区域(Highlight a Region of Time-Series Plot with Matplotlib)
  7. matplotlib可视化基本散点图、在图像多个指定区域绘制方框、进行自定义色彩填充(Draw Multiple Rectangles)
  8. R语言dataframe数据列中的缺失值NA的个数统计实战:特定数据列的NA值统计、所有特征的NA值统计
  9. qzone.class.php,PHP实现QQ空间自动回复说说的方法
  10. ISLR_Power