链接地址:https://productcoalition.com/a-guide-to-googles-recommended-architecture-for-android-apps-8cfc1c774755
就像所有软件一样,Android应用程序也应该遵循通用的架构规则和模式,没有遵循正确架构的Android应用程序往往会因为缺乏一致的设计而变得很难维护。
考虑到良好架构的重要性,人们如何选择就变得尤其重要,在大多数情况下,我更推荐谷歌的标准架构作为Android应用程序的起点,然后随着应用程序变得越来越复杂,可以添加一些新的概念。
那么谷歌推荐的Android应用开发架构指南是怎样的呢?很简单,以下是一些要遵循的规则:
reactive
使用viewmodel和LiveData
使用存储库获取和缓存数据
在本文中,我们将讨论当前正在使用的Android应用程序的通用体系结构的优缺点,从而帮助你更好的选择。
在专注于Android之前,我想先讨论一下不同软件架构的有效性。根据我的经验,无论平台如何,成功实现软件体系结构都需要三件事:
如果架构的可变动部分过多,则无论是在概念上还是在技术上都难以使用,假设RxJava在项目中用作并发框架,这个单独的依赖关系意味着任何新加入项目的开发人员都需要了解RxJava,这并不是一件容易学习的事情。此外,它还可能会导致未来的设计和调试问题,随着复杂性的增加,问题也会变得复杂起来,架构的抽象程度越低,工程师就越容易跟上进度维护项目。
这个原则的主要思想是尽可能少地依赖“外部时间”。例如,假设我们的应用程序是使用带有存储库模式架构的MVP开发的,如果存储库保存对某些特定于android的东西(如AsyncLoader)的直接引用,然后每个存储库类与AsyncLoader类耦合。AsyncLoader类是一个由谷歌维护的库,它在某种程度上已被弃用,这使得它的所有依赖项也在某种程度上被弃用。当使用的依赖项没有强大的社区支持,这种风险会变得更大,因为它们很可能被弃用,这种耦合很麻烦,并且随着时间的推移和兼容性问题出现,使项目的维护更加困难。
这个原则主要是关于变更的便捷性。例如,应用程序的UI层能否独立于其业务逻辑或数据层,如果所有的东西都被塞进同一个片段中,这个项目将会变得十分脆弱,当实现新特性的时候,将功能分层是非常有益的,比如将业务逻辑从UI层剥离,这样当你需要改变应用程序的一部分的时候就不会影响其他部分。
软件体系结构中最古老和最广泛使用的设计模式之一是MVC,它在视图(如何表示数据)、模型(如何构造数据)和控制器(如何处理用户交互)之间有很强的分离。大多数情况下,Android被设计成可以遵循MVC模式。然而,Android的MVC实现的问题是,Activity同时是视图和控制器,这违反了单一责任原则,这是这个架构的关键。
Android社区开始越来越多地利用MVP模式,在这个模式中,业务逻辑被定义在名为presenter的类中。1个view 对应一个presenter,事实证明,这种模式非常有效,因为业务逻辑很好地隔离了,View可以独立于presenter交换出来。
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。
对于更细粒度的方法,可以引入意图的概念。每个用户交互都是定义应用程序屏幕的意图集合的一个实例,屏幕上的每一个变化都被封装在另一个意图中,该意图从一个中心位置(如演示器、控制器或状态机)发回。这里的主要思想是提供一个单向数据流(UDF),其中数据和屏幕更改来自一个地方,但流向单个方向。
在以上这些选项中,谷歌真正推荐的是什么?MVVM,下面就让我们深入了解一下MVVM工具集的基本构建块。关注公众号 逆锋起笔,回复 pdf,下载你需要的各种学习资料。
Jetpack是谷歌用于构建和架构Android应用程序的工具集。它由许多不同的库组成,帮助开发人员们摆脱自己编写这些工具的负担,最常用的组件有LiveData、ViewModel、Data Binding、Navigation Component和Room。
在MVVM的设置中,一个典型的屏幕由什么组成,在较低的层次上有一个View,Activity/Fragment,在它之上有一个视图模型,它暴露了活数据,除了视图模型,我们通常可以利用Room来本地存储数据的存储库。
ViewModel是一种特殊的类,它为旋转屏幕时的常见问题提供了优雅的解决方案,每当屏幕旋转时,顶部的活动/片段就会被销毁并重新创建,视图中可见的数据也会丢失。这有一个很好的好处,即作为第一个缓存层,当ViewModel处于活动状态并创建了一个新视图时,该视图可以直接从ViewModel中获取数据,而不需要任何网络调用。
LiveData是一个数据持有类,它是一个特殊的类,它知道如何与生命周期所有者(如活动和片段)对话。LiveData最有用的地方在于,LiveData采用了观察者模式有关,LiveData是被观察者,当数据有变化时会通知观察者(UI)。LiveData还能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除掉。
存储库有一个职责,那就是为视图模型提供数据。存储库可以很简单,它们可以从网络获取和传递数据,也可以在本地缓存和存储数据。一种常见的模式是从网络获取数据并将其缓存到本地,以减少网络调用的数量,并为用户提供脱机体验。
存储库可以在本地存储数据,就局部持久性而言有多种选择,Jetpack推荐Room,它负责创建SQLight表,并提供了存储和检索数据的简单方法
在从网络获取数据时,谷歌推荐使用Retrofit库。它可以与协程和多种响应类型一起工作,如JSON、XML等。
谷歌的Android应用架构做得很好,正如我们所讨论的,Android应用程序有多种架构。Google的主要建议支持MVVM,它利用LiveData和ViewModels之类的东西来解决Android应用程序面临的两个最常见的问题,逻辑和行为的正确使应用程序既灵活又易于维护。
此外,Google通过其Jetpack指南提供了大量资源,(地址:
https://developer.android.com/jetpack/guidehttps://developer.android.com/jetpack/guide
)可帮助开发人员入门。从那里可以很容易地构建架构来支持项目需求,方法是对诸如依赖注入使用什么之类的东西进行决策。在此过程中,重要的是要记住要尽可能地简化。
点个『在看』支持下
本文分享自微信公众号 - 逆锋起笔(readdot)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/codexiaosheng/blog/4925979