Android应用架构演变

androidArchitecture

Android的开发生态系统变化迅速,每周都有新的工具,新的库更新。我们用于构建Android应用程序的体系结构和技术也不断发展。

Initial Architecture

开始,使用简单粗暴的架构,代码是两层结构:数据层负责从REST APIs检索/保存数据和存储持久性数据。视图层,负责处理和显示UI上的数据.
APIProvider则提供了一些方法让Activities和Fragments更容易的和REST API交互。 类似的,CacheProvider 包含一些检索和存储 SharedPreferences 或者 SQLite 数据的方法,使用回调把结果返回给Acticities。
androidArchitecture
这种结构的主要问题在于视图层负责太多了,想象一下,应用加载一个博客文章列表,先把这些文章存到SQLite数据库然后在把这些文章在ListView里显示出来, 那么Activity就需要做下面的事情:
调用 APIProvider 里的回调方法loadPosts,等待这个回调成功,然后调用CacheProvider里的回调方法savePosts,又等待这个回调成功, 最后在ListView显示。
这是一个简单的例子, 实际开发中会更复杂,这样会使得Activities和Fragments变得非常的臃肿和难以维护, 大量的嵌套回调也意味着代码的难以理解,这时要对代码做一些改变或者添加新的功能是非常痛苦的事情。 而且大量的逻辑都在其中,单元测试也变得困难。

RxJava Driven Architecture

RxJava的出现终于可以解决嵌套回调的问题,RxJave可以通过异步流管理数据。类似上一种架构,这个架构也分为数据层和视图层, 数据层包含DataManager 和一系列的 helpers。视图层由Android框架控件组成。
Helper类即辅助类,有非常具体的责任,并以简明的方式实现它们。例如,大多数项目都有一些helper类来访问REST API,读取数据或与 第三方的SDK进行交互。不同的应用将具有不同数量的helper类,但最常见的是:
PreferencesHelper :读取和保存SharedPreferences数据。
DatabaseHelper :处理访问SQLite数据库。
Retrofit services:执行REST APIs回调方法。
DataManager是体系结构的大脑,它广泛使用RxJava来对从辅助类检索的数据进行合并,过滤等操作。 DataManager的目的是减少Activities和Fragments的工作量。

androidArchitecture

为什么这个架构更好?
1. 不需要嵌套回调。
2. DataManager接管了以前视图层的一部分责任。因此,它使Activities和Fragments更轻巧。
3. 单元测试更加容易。
4. 清晰的责任分离,只有DataManager作为唯一与数据层交互的点。

这个架构的问题?
1. 对于大型和非常复杂的项目,DataManager会变得过于臃肿,难以维护。
2. 虽然视图层组件,如活动和片段变得更加轻巧,他们仍然必须处理管理RxJava订阅,分析错误等相当数量的逻辑。

MVP Based Architecture

数据层保持不变,只是叫Pattern更合适。
Presenters负责从数据层加载数据和当结果处理好后调用视图层里正确的方法。 他订阅DataManager返回的被观察者,因此他会处理调度和订阅的事情,此外,他还可以分析错误代码,如果需要还可以 对数据进行额外的操作。 例如,我们需要过滤一些数据,而这些过滤不会在其他地方被复用,那就可以在Presenters层实现而不是在DataManager。
视图层由Presenters协助,所以不直接订阅被观察者,主要是实现一些接口,如showError()或showProgressIndicator()。 也负责处理用户交互,例如点击事件,视图层调用Presenters里的正确方法来做相应处理。 例如,我们通过点击一个按钮加载一系列文章,我们的Activity在onClick listener里将调用presenter.loadTodayPosts()方法。

androidArchitecture

为什么这种架构更好?
1. 活动和片段变得非常轻巧。他们唯一的责任是建立/更新用户界面和处理用户事件。因此,它们变得更易于维护。
2. 很容易进行单元测试。
3. 整个架构变得非常友好。如果DataManager变得臃肿,我们可以通过移动一些代码到Presenters缓解这一问题。

还有什么问题?
当代码库变得非常庞大和复杂,只有一个数据管理器(DataManager)仍然是一个问题。

需要强调的是这也不是完美的架构,相信有一种架构能完美的解决所有问题是很图样图森的,Android生态系统将继续以快速的步伐不断发展, 我们必须通过探索,阅读和实验,使我们可以找到更好的方法来继续建设优秀的Android应用程序。