changjiashuai's blog

Runnig...

The future belongs to those who believe in the beauty of their dreams.


Android 应用架构演变

Android 应用架构演变

原始架构

Android刚开始的时候没有第三方库,基本方式就是AsyncTaskHandler配合使用,简单直接没有过多分层设计

代码被划分为两层结构:Data Layer(数据层)负责从数据源获取和存储数据;View Layer(视图层)负责处理并将数据展示在UI

  • DataProvider提供一些方法,使ActivityFragment能够实现与数据源的数据交互。这些方法使用AsyncTask在一个单独的线程内执行耗时操作(网络请求、数据库操作等),然后通过回调将结果返回给ActivityFragment

优点

  1. 结构少容易理解每层的目的

缺点

  1. ActivityFragment变得非常庞大并且难以维护
  2. 可能会导致过多的回调嵌套Callback Hell(回调地狱),代码结构丑陋难以阅读和理解,在此基础上添加或更改新特性成本巨大而且容易出错
  3. 很多业务逻辑都在ActivityFragment中,单元测试根本没法进行

MVC(来自Java Web)

随着界面越来越多,业务越来越复杂,开发人员开始考虑架构设计,本身Android就是用Java语言编写的,所以自然就首先考虑用原来Java Web端成熟的设计方案MVC尝试划分结构

优点

  1. 耦合性低:减少模块之间代码的相互影响
  2. 可扩展性好:添加需求,更改代码相对容易。
  3. 模块职责划分明确:利于代码维护。

缺点

  1. 相对于Android APP来说MVC也仅仅起到了部分解耦的作用,主要是ControllerView视图和Model模型分离,但是在Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,即一部分View视图和Activity Controller控制器是绑定在一起的,所以相对于Java所适用的MVC方案,在Android中仅仅起到部分优化效果,在UI更新逻辑复杂多变的情况弊端更加会被放大。

MVP

Google对Android APP开发第一次结构设计的尝试

MVP是对MVC的改进,让Model和View完全解耦

优点

  1. ModelView不存在直接关系
  2. Presenter与View、Model的交互使用接口定义交互操作进一步达到松耦合也可以通过接口更加方便地进行单元测试

缺点

  1. 代码很清晰,不过增加了很多

MVVM

MVVM最早是由微软提出的 Google实现了DataBinding机制。要实现MVVMViewModel就需要把数据与UI进行绑定,<data>节点就为此提供了一个桥梁,我们先在<data>中声明一个variable,这个变量会为UI元素提供数据(例如TextViewandroid:text),然后在Java代码中把”后台”数据与这个variable 进行绑定。 类似于Java Web JSP中的标签语法

ViewViewModel绑定在一起,ViewModel的改变会同步到View层,从而View层作出响应

优点

  1. 隔离了UI层和业务逻辑层,降低程序的耦合度

缺点

  1. 会产生很多类型

RxJava(Reactive Programming for Java)+RxAndroid

RxJava允许通过异步流的方式处理数据,并且提供了很多操作符,可以将这些操作符作用于流上从而实现转换,过滤或者合并数据等操作。RxAndroidRxJava基础上实现了线程的自由切换。

优点

  1. RxJava的Observable和操作符避免了嵌套回调的出现。
  2. 响应式编程能够非常好的简化代码,让代码的可读性、稳定性都得到很大程度的提高。

缺点

  1. 仅仅是一种编程方式,对Android而言,没有生命周期概念,需要自己维护管理

agera(Reactive Programming for Android)

Google实现的类似RxJava的函数式编程

Activation lifecycle and event chain

一个Observable当它被至少一个Updatable观察时它处于active状态,当他不被任意一个Updatable观察时处于inactive状态。从另一个角度说:一个Updatable通过注册到处于inactiveObservable上来激活Observable;当处于activeObservable仅具有一个注册的Updatable时,该Updatable通过取消注册来使其停用。

Observables and updatables

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

UI lifecycle

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

优点

  1. 结构少容易理解每层的目的

缺点

  1. 刚推出还没被大面积使用

总结

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

最近的文章

Android 下拉刷新相关库

Ultra Pull To Refresh https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 支持 API LEVEL >= 8。下拉刷新 + 加载更多?本类库是单纯的下拉刷新。如果你需要用到加载更多,看这个项目: https://github.com/liaohuqiu/android-cube-app 先上两张StoreHouse风格的截图! 感谢 CBStoreHouseRefreshControl. ...…

Android下拉刷新相关库继续阅读
更早的文章

Android Studio中六种依赖

在Android Studio中有六种依赖Compile,Provided,APK,Test compile,Debug compile,Release compileCompilecompile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。ProvidedProvided是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk。APK只会打包到apk文件中,...…

Android Studio依赖继续阅读