Android 应用架构演变
原始架构
Android刚开始的时候没有第三方库,基本方式就是
AsyncTask和Handler配合使用,简单直接没有过多分层设计

代码被划分为两层结构:Data Layer(数据层)负责从数据源获取和存储数据;View Layer(视图层)负责处理并将数据展示在UI上
DataProvider提供一些方法,使Activity和Fragment能够实现与数据源的数据交互。这些方法使用AsyncTask在一个单独的线程内执行耗时操作(网络请求、数据库操作等),然后通过回调将结果返回给Activity或Fragment。
优点
- 结构少容易理解每层的目的
缺点
Activity和Fragment变得非常庞大并且难以维护- 可能会导致过多的回调嵌套
Callback Hell(回调地狱),代码结构丑陋难以阅读和理解,在此基础上添加或更改新特性成本巨大而且容易出错 - 很多业务逻辑都在
Activity和Fragment中,单元测试根本没法进行
MVC(来自Java Web)
随着界面越来越多,业务越来越复杂,开发人员开始考虑架构设计,本身Android就是用Java语言编写的,所以自然就首先考虑用原来Java Web端成熟的设计方案
MVC尝试划分结构

优点
- 耦合性低:减少模块之间代码的相互影响
- 可扩展性好:添加需求,更改代码相对容易。
- 模块职责划分明确:利于代码维护。
缺点
- 相对于
Android APP来说MVC也仅仅起到了部分解耦的作用,主要是Controller将View视图和Model模型分离,但是在Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,即一部分View视图和Activity Controller控制器是绑定在一起的,所以相对于Java所适用的MVC方案,在Android中仅仅起到部分优化效果,在UI更新逻辑复杂多变的情况弊端更加会被放大。
MVP
Google对Android APP开发第一次结构设计的尝试

MVP是对MVC的改进,让Model和View完全解耦
优点
Model与View不存在直接关系- Presenter与View、Model的交互使用接口定义交互操作进一步达到松耦合也可以通过接口更加方便地进行单元测试
缺点
- 代码很清晰,不过增加了很多
MVVM
MVVM最早是由微软提出的 Google实现了DataBinding机制。要实现
MVVM的ViewModel就需要把数据与UI进行绑定,<data>节点就为此提供了一个桥梁,我们先在<data>中声明一个variable,这个变量会为UI元素提供数据(例如TextView的android:text),然后在Java代码中把”后台”数据与这个variable进行绑定。 类似于Java Web JSP中的标签语法
View和ViewModel绑定在一起,ViewModel的改变会同步到View层,从而View层作出响应

优点
- 隔离了UI层和业务逻辑层,降低程序的耦合度
缺点
- 会产生很多类型
RxJava(Reactive Programming for Java)+RxAndroid
RxJava允许通过异步流的方式处理数据,并且提供了很多操作符,可以将这些操作符作用于流上从而实现转换,过滤或者合并数据等操作。RxAndroid在RxJava基础上实现了线程的自由切换。

优点
- RxJava的Observable和操作符避免了嵌套回调的出现。
- 响应式编程能够非常好的简化代码,让代码的可读性、稳定性都得到很大程度的提高。
缺点
- 仅仅是一种编程方式,对
Android而言,没有生命周期概念,需要自己维护管理
agera(Reactive Programming for Android)
Google实现的类似
RxJava的函数式编程
Activation lifecycle and event chain
一个
Observable当它被至少一个Updatable观察时它处于active状态,当他不被任意一个Updatable观察时处于inactive状态。从另一个角度说:一个Updatable通过注册到处于inactive的Observable上来激活Observable;当处于active的Observable仅具有一个注册的Updatable时,该Updatable通过取消注册来使其停用。

Observables and updatables
一个
Observable代表一个事件源,一个Updatable观察这些事件。一个Updatable通过Observable.addUpdatable(Updatable)注册到observable,通过Observable.removeUpdatable(Updatable)取消注册。一个事件以Updatable.update()的形式被发送到updatable。

UI lifecycle
事件链特别适合伴随UI的生命周期构建响应式结构

优点
- 结构少容易理解每层的目的
缺点
- 刚推出还没被大面积使用
总结
原始架构MVCMVPMVVM这四种架构方式对Android APP来说都是项目结构采用一种方式后基本架构就不会改变。RxJavaagera仅仅是一种编程方式的改变,但这种方式对手机应用开发来说非常合适,鉴于以上架构的演变,原始架构基本不会有人再使用了,MVC在移动端也是不太适合,MVPMVVM都是Google自家推出的,个人实践中尝试的RxJava+MVP组合使用,MVVM个人感觉用着不爽,涉及xml和代码两处容易出问题。agera还在开发阶段,后续怎样未知。