Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Android SDK
Code

安卓架构组件介绍

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Android Architecture Components.
Android Architecture Components: Lifecycle and LiveModel

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

Android在2005年被引入,在这12年里,Android取得了惊人的成功,它成为安装量最高的移动操作系统。 在这12年间,有14种不同版本的操作系统被推出,Android系统越来越成熟。 然而,Android平台中一个非常重要的领域一直被忽视,那就是:一种标准的架构模型,这种架构模型能够处理平台的特性,并且简单到足以被普通开发着理解和使用。

好吧,好饭不怕晚。 在上一次Google I / O大会中,Android团队终于决定解决这个问题,并回应世界各地开发者的反馈意见,宣布推出Android应用架构,并提供实现它的基础:新架构组件。 更棒的是,他们不仅做到了这一点,而且还是以我们都知道和喜爱的系统开源方式。

Architecture Components

在本教程中,我们将探讨Android团队在Google I / O大会中提出的标准化架构,并研究新架构组件的主要元素,包括:LifecycleViewModelLifeDataRoom。我们不会太关注代码,而是侧重于这些主题背后的概念和逻辑。 我们会看一些简单的代码片段,这些代码片段都是使用Kotlin语言编写的,Kotlin是被Android官方支持的神奇语言。

1.Android缺少什么?

如果您安卓开发新手,那么您可能不知道我在说什么。毕竟,应用程序架构是一个很泛化的话题。 但相信我,你会很快会意识到它的重要性!随着APP的发展和APP越来越复杂,APP架构将变得越来越重要。它可以使你的工作变得更轻松,也能让你的生活变成地狱。

APP架构

粗略地说,APP架构是需要在开发过程开始之前持续进行的计划。该计划确定了不同应用程序的组件被组织和绑定的对应映射关系。它提出了在开发过程中应遵循的指导原则,并强制作出一些牺牲(通常与更多的类和样板相关),以便最终帮助您构建一个更加可测试,可扩展和可维护的精心编写的应用程序。

软件应用程序架构是定义满足所有技术和操作要求的结构化解决方案的过程,它能优化常见的质量属性,包括安全性和可管理性等。它涉及到一系列基于许多因素的决策,每一个决策都可能对应用程序的质量,性能,可维护性和整体成功产生重大影响。
- 微软软件架构与设计指南

良好的架构考虑了很多因素,特别是系统的特点和局限性。 现在有许多不同的架构解决方案,他们各有千秋。然而,所有愿景之间的一些关键概念是共同的。

旧的错误

直到上次Google I / O大会之前,Android系统并没有推荐任何指定的应用程序开发架构。这意味着你完全可以自由地采用任何模型:MVP,MVC,MVPP,甚至根本没有架构模型。 除此之外,Android框架甚至没有为系统自身(特别是组件的生命周期)的问题提供本地化解决方案。

Great news at the Google IO 2017

因此,如果您想在应用程序中使用MVP(Model View Presenter)模型,那么你需要从头开始你自己的解决方案,编写大量样板代码,或者在没有官方支持的情况下使用某个第三方库。而且,没有标准会导致了许多应用程序写的很糟糕,代码库难以维护和测试。

正如我所说,多年来这种情况一直备受诟病。事实上,关于这个问题,我最近写了一系列文章,即 How to Adopt Model View Presenter on Android 。 但最重要的是,经过12年的漫长岁月,Android团队终于决定听听我们的抱怨并帮助我们解决这个问题了。

2.安卓架构

新的Android体系架构指南(Android Architecture Guide )定义了一些关键原则,一个优秀的Android应用程序应该符合这些原则,而且该指南为开发者创建优秀的APP提供了安全的路线。但是,该指南明确规定,所提出的路线不是强制性的,采用哪种类型的架构由开发者自己决定。

根据指南,优秀的Android APP应该提供一个牢固的关注点隔离(separation of concerns),并且在model层驱动UI。 任何不处理UI或与操作系统交互的代码不应该在Activity 或Fragment中,因为保持Activity 和 Fragment尽可能干净,可以避免许多与生命周期相关的问题。 毕竟,系统可以随时销毁掉Activity 或 Fragment。此外,数据应该由与UI隔离和与生命周期隔离的model层来处理。

被推荐的新架构

Android推荐的架构很难在我们所熟知的标准模型中找到对应。 它看起来像一个MVC(Model View Controller)模型,但它与系统的架构密切相关以至于很难使用已知的约定标记每个元素。 然而,这不重要的,因为重要的是它依赖于新的架构组件来创建关注点分离,而这具有出色的可测试性和可维护性。更棒的是,它很容易实现。

要了解Android团队提出的建议,我们必须了解架构组件的所有元素,因为它们将为我们提供一些重要的功能。 一共有四个组件,每个组件具有特定的角色,包括:RoomViewModelLiveDataLifecycle。它们每个组件都有自己的责任,他们共同努力创造一个坚实的架构。 我们来看一下这个架构的简化图,以便更好地理解它。

Android Architecture

正如你所看到的,我们有三个主要元素,每一个都有它自己的责任。

  1. Activity 和 Fragment代表View层,它不涉及业务逻辑和复杂操作。它只配置视图,处理用户交互,最重要的是观察和展示从ViewModel获取的LiveData元素。
  2. ViewModel自动观察view的Lifecycle状态,在配置更改和其他Android Lifecycle事件期间保持一致性。view还要从Repository中获取数据,这是由可观察的LiveData提供的。 重要的是要了解ViewModel从不直接引用View,并且数据更新总是由LiveData实体完成的。
  3. Repository不是一个特殊的Android组件。它是一个简单的类,没有任何特定的实现,它负责从可用资源和数据库中获取数据到Web服务。 它处理所有这些数据,通常将它们转换为可观察的LiveData并提供给ViewModel
  4. Room数据库是一个SQLite映射库,方便处理数据库。它自动编写大量样板,在编译时检查错误,最重要的是它可以直接返回带有可观察的LiveData的查询结果。

我相信你已经注意到我们已经谈过很多关于可观察(observables)了。观察者模式LiveData元素和Lifecycle感知组件的基础之一。 一旦某个对象的状态或数据更改了,观察者模式就会通知观察者列表。所以当Activity观察一个LiveData实体时,它就会在数据修改后收到更新通知。

Android还推荐使用DI(依赖注入)系统(比如Google的 Dagger 2)或使用服务定位器模式(这比DI简单,但没有DI优点多)来整合其架构。在本教程中,我们不会讲解DI或服务定位器,但Envato Tuts +有相关教程。 但是,请注意,在本系列的第二部分中将介绍Dagger 2和Android组件的一些特殊功能。

3.架构组件

我们必须深入到新组件的各个方面,才能真正理解并使用这种架构模型。但是,我们将不会在本教程中探讨所有的细节。 在本教程中,由于每个元素的复杂性,我们将仅讨论每个元素背后的一般思路,并查看一些简化的代码片段。 我们将尝试使用足够多的基础知识来讲解组件并让您开始。但不要害怕,因为这个系列后面的文章将深入挖掘架构组件的所有特性。

Lifecycle感知组件

大多数Android应用程序组件都有生命周期Lifecycle,它们由系统自身直接管理。 直到最近,生命周期Lifecycle由开发者来管理,包括监控组件的状态并相应地执行,在适当的时候初始化和结束任务。 然而,这很容易让人困惑并犯错误。但是android.arch.lifecycle包的出现改变了这一切。

现在,Activities 和 Fragments有一个Lifecycle对象,这个对象可以被LifecycleObserver类观察到,比如ViewModel或实现此接口的任何对象。 这意味着,被观察对象的状态变化后,观察者将收到更新,例如Activity暂停或启动时。 它还可以检查被观察对象的当前状态。所以,现在,这些必须考虑框架生命周期的操作处理起来要容易得多。

LifecycleObserver reacts to LifecycleEvents

到目前为止,要创建符合此新标准的Activity 或 Fragment,您必须继承LifecycleActivityLifecycleFragment。但是,由于Android团队旨在将这些新工具与其框架完全集成,所以有时候是不必要的。

LifecycleObserver接收Lifecycle事件,并可以通过注解进行响应。不需要重新方法。

LiveData组件

LiveData组件是数据持有者,其包含可以被观察的值。鉴于观察者在LiveData实例化期间提供了LifecycleLiveData将根据Lifecycle状态做出响应。 如果观察者的Lifecycle状态为STARTEDRESUMED,则观察者处于active状态;否则,它是inactive的。

LiveData知道数据何时被更改,假如观察者是active状态,它就会收到更新。 LiveData的另一个有趣的特点是,如果观察者处于Lifecycle.State.DESTROYED状态,为了避免Activities 和Fragments观察时出现内存泄漏,可以删除观察者。

LiveData value updating process

LiveData必须实现onActiveonInactive方法。

要观察LiveData组件,必须调用observer(LifecycleOwner,Observer )

ViewModel组件

新架构的组件中最重要的一个类是ViewModel,它被设计为保存与UI相关的数据,在配置更改(如屏幕旋转)时保持其完整性。 ViewModel能够与Repository进行通信,从Repository中获取LiveData,并且可被view观察。 在配置更改后,ViewModel也不需要对Repository进行新的调用,从而优化了代码。

ViewModel is tight to UI Lifecycle

要创建view层,需要继承ViewModel类。

要从view层访问,可以调用ViewProviders.of)Activity | Fragment).get(ViewModel :: class)。此工厂方法将返回一个新的ViewModel实例,或者根据需要获取保留的实例。

Room组件

Android从一开始就支持SQLite数据库;然而,为了让SQLite工作,开发者一般需要编写大量样板代码。另外,SQLite没有保存POJO(纯Java对象),并且在编译时没有检查查询。 Room组件就是用来解决这些问题的!它是一个SQLite映射库,能够持久化Java POJO,直接将查询转换为对象,在编译时检查错误,并从查询结果生成LiveData可观察者。 Room组件是带有一些很酷的Android附加组件的对象关系映射库。

到目前为止,使用其他ORM Android库能做的,大部分可以用Room件来做。然而,其他ORM Android库都没有得到官方的支持,最重要的是其他ORM Android库不能生成LifeData的结果。 Room库完美地适合于所提出的Android架构上的持久层。

要创建一个Room数据库,您需要一个@Entity才能持久化,这可以是任何Java POJO,一个@Dao接口进行查询和输入/输出操作,还有一个继承RoomDatabase@Database抽象类

为你的工程增加架构组件

现在,要使用新的架构组件,您需要先将Google资源库添加到build.gradle文件中。有关详细信息,请参阅官方指南

结语

正如你所见,Android提出的标准化架构涉及到了很多的概念。不要期望完全理解这些概念。 但是,您现在肯定有足够的知识来了解架构背后的逻辑以及不同架构组件的作用。

我们讨论了Android提出的标准化架构及其组件相关的大多数主题;但是,这篇文章无法涵盖关于组件实现等功能的详细细节,如Repository类和Dagger 2系统。 我们将在下一篇文章中探讨这些话题。

再见

Envato qr branded
关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.