Android and Architecture(安卓和架构)

安卓和架构

译文地址:https://android-developers.googleblog.com/2017/05/android-and-architecture.html

Android操作系统为构建在各种设备和外形上运行良好的应用程序提供了坚实的基础。据说,我们听取了开发者的反馈。

像复杂的生命周期和缺乏推荐的应用程序架构这样的问题使编写健壮的应用程序变得具有挑战性。

我们必须让它变的更简单,更有趣去编写健壮的应用程序,让开发者能更加专注于那些可以创新的领域,今天我们宣布推出Android架构指南及架构组件的预览。相对于重新塑造轮子,我们也认识到很多开源的Android库也在做这方面的工作。

建议,而不是处方(方法)

我们都知道不仅仅只有一个编写Android应用程序的方法。我们现在所提供的是一系列能帮助你构建一个能使用这种特殊的方式与Android交互的应用程序。Android框架拥有那些定义良好的api用来处理和操作系统的联系或者交互,比如说Activitys,但是,这些只是应用程序的入口点,并不是应用程序架构的构建块;框架不会强制要求你将数据模型从UI组件中分离开来,或者提供一个独立于生命周期的持久化数据的方式。

构建块

Android架构组件通过协同工作来实现一个理想的应用程序架构,同时又分别解决开发者的痛点。这些组件可以帮你:
1. 自动管理Activity和fragment生命周期避免内存和资源泄露
2. 将Java数据对象持久化到SQLite数据库中

生命周期组件

新的生命周期感知组件提供了将应用程序的核心组件绑定到生命周期事件的结构,从而消除了显式的依赖路径。

一个典型的Android观察模型是在onStart()中开始观察,并在onStop()中停止观察。这听起来很简单,但通常你会有几次异步调用同时发生,所有这些都会管理其组件的生命周期。很容易错过边缘的情况。生命周期组件可以帮助。

生命周期,生命周期所有者,生命周期观察者

所有这些的核心类是生命周期。它使用当前生命周期状态的枚举以及生命周期事件的枚举来跟踪其关联组件的生命周期状态。

这里写图片描述
生命周期状态及事件

生命周期所有者是一个通过getLifecycle()方法返回生命周期对象的接口,而生命周期观察者是一个可以通过向其方法添加生命周期注释来监视组件生命周期的类。将这些集中在一起,我们可以创造生命周期感知组件,可以监视生命周期事件并查询当前的生命周期状态。

public class MyObserver implements LifecycleObserver {
  public MyObserver(Lifecycle lifecycle) {
    // Starts lifecycle observation
    lifecycle.addObserver(this);
   ...
  }
  public void startFragmentTransaction() {
     // Queries lifecycle state
     if (lifecycle.getState.isAtLeast(STARTED)) {
        // perform transaction
     }
  }

  // Annotated methods called when the associated lifecycle goes through these events
  @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
  public void onResume() {
  }
  @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
  public void onPause() {
  }
}
MyObserver observer = new MyObserver(aLifecycleOwner.getLifecycle());

实时数据

实时数据是一个可观察的生命周期感知数据持有者类。你的UI代码订阅了底层的数据变化,绑定到LifecycleOwner,实时数据保证观察者:
1. 当生命周期处于活动的状态(start,resumed)时获取数据的更新
2. 当生命周期持有者销毁时,实时数据将被移除
3. 当生命周期持有者因配置更改而重新启动,或者因为堆栈返回而重新启动时,获取最新的实时数据

这有助于消除许多内存泄漏的途径,并通过避免更新停止的活动来减少崩溃。
许多监听器可以观察到LiveData,每个监听器都绑定到生命周期所有者,如FragmentActivity。

视图模型

ViewModel是一个帮助类,包含用于将视图数据所有权与UI控制器逻辑分离的Activity或Fragment的UI数据。只要Activity / Fragment的范围是活着的,包括何时由于配置更改而销毁和重新创建Activity / Fragmentis,ViewModel就会被保留。 这允许ViewModel使UI数据可用于重新创建的活动或片段实例。 使用LiveData包装存储在ViewModel中的UI数据为数据提供了可观察的生命周期感知的家庭。 LiveData处理事件的通知方,而ViewModel确保数据保持适当。

数据持久化

Android架构组件还可以使用Room库简化数据持久性。 Room提供了一个对象映射抽象层,允许流畅的数据库访问,同时充分利用SQLite的全部功能。

核心框架为处理原始SQL内容提供内置支持。 虽然这些API是强大的,但它们相当低级,需要大量的时间和精力才能使用:
1. 没有对原始SQL查询的编译时验证。
2. 随着架构的更改,您需要手动更新受影响的SQL查询。 这个过程可能是耗时且容易出错的。
3. 您需要编写大量样板代码以在SQL查询和Java数据对象之间进行转换。

在为SQLite提供抽象层的同时,Room可以为您处理这些问题。

数据库,实体类,数据接入对象(Database, Entity, and DAO)

下面是Room的三个主要组件:
1. Entity:实体表示使用注释的Java数据对象构造的单个数据库行的数据。 每个实体都持久化在自己的表中。
2. DAO:(数据访问对象)定义访问数据库的方法,使用注释将SQL绑定到每个方法。
3. Database:数据库是一个持有者类,它使用注释来定义实体列表和数据库版本。 类内容定义了DAO列表。 它也是底层数据库连接的主要访问点。

这里写图片描述

要使用Room,您可以注释要保留为实体的Java数据对象,创建一个包含这些实体的数据库,并使用SQL定义一个DAO类来访问和修改数据库。

@Entity
public class User {
    @PrimaryKey
    private int uid;
    private String name;
    // Getters and Setters - required for Room
    public int getUid() { return uid; }
    public String getName() { return name; }
    public void setUid(int uid) { this.uid = uid; }
    public void setName(String name) { this.name = name; }
}

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List getAll();
    @Insert
    void insertAll(User... users);
}

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

应用程序架构指南

架构组件设计为独立的,但是当它们被并入有效的应用程序架构中时,它们是最有效的。 今天我们推出了一个应用架构指南,展示了如何使用架构组件构建一个强大的,模块化的和可测试的应用程序。

该指南主要有三个目标:
1. 定义适用于Android应用开发的原则。
2. 描述与这些原则配合使用的应用程序架构。
3. 显示如何使用架构组件实现该架构。

我们建议所有不得不处理这些问题的开发人员阅读指南; 即使您对现有的应用程序架构感到满意,“指南”将具有有用的原则和见解。

这仅仅只是开始

我们计划继续接受意见,并继续引入新的架构组件,以便Android开发人员在构建应用程序时做出明智的选择。 我们鼓励您尝试预览,并就我们正在做的事情提供反馈意见,因为我们努力一起使Android应用程序开发更加轻松,更有趣。

要了解有关Android架构相关的更多信息,请查看:
1. Lifecycle-aware codelab
2. Persistence codelab
3. Guide to App Architecture

展开阅读全文

没有更多推荐了,返回首页