前言
这篇可不是干货篇,这是概述篇,其实也可以说是预告篇。笔者最近看到不少人讨论 Google 推的 Android Architecture Components,这是Google推出的一个新的项目架构。有些人讨论说,不会吧,又来一个,我还没把Google官方的MVP架构用在真实项目上呢。
笔者正是因为这个原因,决定基于上家公司的真实项目,将项目的架构都提取出来,教你如何一步一步搭建一个实战的项目架构。体验一下整个项目架构的搭建过程。
不过,项目架构其实不是一次性搭建完成的,而是在项目的开发过程中不断的摸索优化和重构得来的。作为这个项目的Android负责人,架构都是本人搭建起来的,其中遇到的坑和艰辛……(此处省略无限个字吧)
同时,笔者还会教你如何根据搭建的架构进行单元测试。为什么要教单元测试呢,因为你需要学会单元测试,并站在测试的角度去搭建可测并且更加易于测试的架构。这就是有时候明明代码可以继续封装或者可以设计成这样,但是为什么选择这个方式呢,为什么要这么优化代码呢,你或许可以在单元测试的过程中找到答案。
我们先来了解下架构的模式,有利于架构的搭建!
MVC
MVC模式的意思是,app可以分成三个部分。
- 视图(View):用户界面。
- 控制器(Controller):业务逻辑
- 模型(Model):数据保存
各部分之间的通信方式如下:
- View 传送指令到 Controller
- Controller 完成业务逻辑后,要求 Model 改变状态
Model 将新的数据发送到 View,用户得到反馈
- 各部分之间的通信,都是单向的。
- View 通过 Controller与Model 联系,Model 可以直接联系View。
- Android 中通常Activity 担任了 View 和 Controller两个角色,业务逻辑都部署在 Activity中。
MVP
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
- 各部分之间的通信,都是双向的。
- View 与 Model 不发生联系,都通过 Presenter 传递。
- Android 中通常Activity 担任了 View角色,或者View角色由Fragment等View担任。而 Presenter非常厚,所有逻辑都部署在那里,所以Activity就变得薄了,不部署任何业务逻辑。
MVVM
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。
Google 官方的MVP架构
architecture的解释:n. 建筑学;建筑风格;建筑式样;建筑艺术;架构。
上面的图是Google官方为广大开发者提供的一个关于架构的示例:
笔者上家公司的项目就是基于 MVP-Rxjava 这个官方demo项目基础上,慢慢搭建起来的。
所以笔者这个系列的下一篇文章就是要讲解MVP-Rxjava这个官方
demo的代码。然后在这个基础上,一步一步搭建起网络框架、图片框架等相关内容。
架构涉及的内容:
- Mvp,Google官方出品的Mvp架构项目,含有多个不同的架构分支(此为Rxjava分支)
- Dagger2,Google根据Square的Dagger1出品的依赖注入框架,通过Apt编译时生成代码,性能优于使用运行时反射技术的依赖注入框架
- Rxjava,提供优雅的响应式Api解决异步请求以及事件处理
- RxAndroid,为Android提供响应式Api
- Rxlifecycle,在Android上使用rxjava都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定activity和fragment的生命周期完美解决
- RxCache,是使用注解为Retrofit加入二级缓存(内存,磁盘)的缓存库.
- PersistentCookieJar,是处理登录获取Cookie并将其持久化
- ExException,是全局统一处理Rxjava错误的类(自封装)
- RxPermissions,用于处理Android运行时权限的响应式库
- Retrofit,Square出品的网络请求库,极大的减少了http请求的代码和步骤
- Okhttp,同样Square出品,不多介绍,做Android都应该知道
- Gson,Google官方的Json Convert框架
- Butterknife,JakeWharton大神出品的view注入框架
- Eventbus,一个事件总线处理库
- KLog,Log框架容器,内部代码极少,但是思想非常不错
- Glide,图片加载库,可更改为其他的库,Api和Picasso差不多,缓存机制比Picasso复杂,速度快,适合处理大型图片流,支持gfit,Fresco太大了!在5.0以下优势很大,5.0以上系统默认使用的内存管理和Fresco类似
- LeakCanary,Square出品的专门用来检测Android和Java的内存泄漏,通过通知栏提示内存泄漏信息
以上可能不全,如果需要会继续加入,下面是单元测试涉及的
- Junit,用断言方式测试方法的返回值
- Mockito,如果方法没有返回值,那么可以用Mockito测试方法的执行顺序。也可以通过拦截修改方法的返回值测试不同状态的执行流程
- Espresso,Google官方出品,用于涉及到Android相关代码的测试,速度慢于Roboletric,但api更丰富更强大