Android和Architecture(架构)

原标题:Android and Architecture
链接:https://android-developers.googleblog.com/2017/05/android-and-architecture.html
作者:匿名
翻译:arjinmc

Android操作系统为构建可在广泛的设备和外形上运行良好的应用程序提供了坚实的基础。话虽如此,我们听取了开发者的反馈意见,像复杂的生命周期和缺乏推荐的应用程序架构这样的问题,使编写健壮的应用程序变得具有挑战性。

我们需要使编写强大的应用程序更轻松,更有趣,让开发人员可以专注创新的领域。今天,我们宣布推出Android应用程序架构指南以及架构组件的预览。而不是在重复造轮子,我们也认识到一些流行的Android库已经实现了这样的功能。

视频简介链接

意见不是处方

我们知道有多种方式来编写Android应用程序。我们提供的一套指南可以帮助你构建Android应用程序,以最好的Android互动的独特方式创建Android应用程序。Android framework具有明确的API来处理与操作系统的联系点,例如Activity,但这些是你的应用程序的入口点,而不是为应用程序架构构建块;framework组件不会强制你将数据模型与UI组件分开,或提供一种清晰的方式来保持与生命周期和数据分开。

构建模块

Android Architecture(架构)组件一起来实现一个理想的应用程序架构,同时他们单独解决开发人员的痛点。这些组件的第一组可帮助你:

  • 自动管理你的活动和片段生命周期,以避免内存和资源泄漏
  • 将Java数据对象持久化到SQLite数据库

生命周期组件

img

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

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

生命周期LifecycleOwnerLifecycleObserver

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

img
生命周期状态和事件

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

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());

LiveData

LiveData 是可观察到的生命周期感知的数据holder类。你的UI代码赞同底层数据的变化,绑到LifecycleOwnerLiveData 来确保观察:

  • 在Lifecycle处于活动状态(STARTED或RESUMED)时获取数据更新
  • 当LifecycleOwner被销毁时被删除
  • 当LifecycleOwner 由于配置更改而重新启动或从后面的堆栈重新启动时,获取最新的数据

这有助于消除许多内存泄漏的途径,并通过避免更新停止的活动来减少崩溃。 LiveData被许多听众观察,每个绑在生命周期所有者,例如Fragment或Activity来观察。

视图模型

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

数据持续性

Android架构组件还可以使用Room 库简化数据持久性。Room提供了一个对象映射抽象层,允许流畅的数据库访问,同时充分利用SQLite的全部功能。核心框架为处理原始SQL内容提供内置支持。虽然这些API是强大的,但它们相当低级,需要大量的时间和精力才能使用:

  • 没有对原始SQL查询的编译时验证。
  • 随着结构的更改,你需要手动更新受影响的SQL查询。这个过程可能是耗时且容易出错的。
  • 你需要编写大量样板代码以在SQL查询和Java数据对象之间进行转换。

当你在为SQLite抽象封装的时候,Room为你处理这些问题。

数据库实体DAO

Room有三个主要组成部分:

  • 实体 表示使用注释的Java数据对象构造的单个数据库行的数据。每个实体都坚持在自己的表中。
  • DAO (数据访问对象)定义访问数据库的方法,使用注释将SQL绑定到每个方法。
  • 数据库 是一个holder类,它使用注释来定义实体列表和数据库版本。类内容定义了DAO列表。它也是底层数据库连接的主要访问点。

img

要使用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();
}

应用程序架构指南

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

  • 定义适用于Android应用开发的原则。
  • 描述与这些原则配合使用的应用程序架构。
  • 显示如何使用架构组件实现该架构。

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

只是开始

我们计划继续受到意见,并继续引入新的架构组件,以便Android开发人员在构建应用程序时做出明智的选择。我们鼓励你尝试预览,并就我们正在做的事情提供反馈意见,因为我们都在一起,使Android应用程序开发更加轻松,更有趣。要了解有关Android体系结构的更多信息,请查看:

results matching ""

    No results matching ""