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还在开发阶段,后续怎样未知。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯Bugly的专栏

手把手教你逆向分析 Android 程序

很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下。 ? 第一张图是在把代码注入到地...

1.2K18
来自专栏架构之路

超清晰的makefile解释、编写与示例

Makefile范例教学 Makefile和GNU make可能是linux世界里最重要的档案跟指令了。编译一个小程式,可以用简单的command来进行编译;稍...

4548
来自专栏青青天空树

node.js+vue.js搭建程序设计类课程教学辅助系统

  毕业才刚刚两个多月而已,现在想想大学生活是那么的遥不可及,感觉已经过了好久好久,社会了两个月才明白学校的好啊。。。额,扯远了,自从毕业开始就想找个时间写下毕...

5452
来自专栏波涛汹涌

在阴影中:Vawtrak(银行木马病毒)意图通过添加新的数据源使得自己更加隐蔽

在Dridex木马活动短暂停止的同时,这个恶意软件背后的犯罪人员立马去寻找(开发)新的交付渠道(攻击方法,钓鱼方式),这看起来像是其他的恶意软件供应商将自己定位...

1633
来自专栏Aloys的开发之路

Python第三方常用工具、库、框架等

       Python ImagingLibrary(PIL):它提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显...

47710
来自专栏向治洪

android开发性能分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项...

2605
来自专栏Android 开发者

[译] 在 SnackBar,Navigation 和其他事件中使用 LiveData(SingleLiveEvent 案例)

8443
来自专栏数据小魔方

左手用R右手Python系列——模拟登陆教务系统

最近在练习R语言与Python的网络数据抓取内容,遇到了烦人的验证码问题,走了很多弯路,最终总算解决了。 在分享这篇文章之前,只想感慨一声,虽然Python拥有...

3758
来自专栏jianhuicode

如何实践MVP+RxJava+Retrofit(1)

为了准备春招,整理了some流行技术,大概是去年5,6月份开始在知乎上看到,后面了解到google早在github上开源了Android开发三种开发模式:MV...

1875
来自专栏Hongten

python开发_常用的python模块及安装方法

adodb:我们领导推荐的数据库连接组件 bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherry...

4273

扫码关注云+社区

领取腾讯云代金券