架构组件版本说明

本页提供有关架构组件版本的信息,其中包括已知问题、限制和一般建议。请先查看相应的说明,然后再使用架构组件。

您的反馈至关重要。请使用问题跟踪器报告问题,以便我们可以将您的反馈整合到最终版本中。

要与其他使用架构组件的开发者讨论问题或想法,请加入 Android 开发 Google+ 社群,并查看架构组件类别

2018 年 8 月 16 日

WorkManager

发布了 WorkManager 1.0.0-alpha07,该版本修复了几个问题,并进行了几项细微的 API 更改。

问题修复

  • 修复了具有负限制的潜在 SQL 查询,该查询可能会返回无限数量的结果。
  • 已完成执行的工作现在可以正确取消其他调度程序中该工作的所有待处理副本。这会导致超出 JobScheduler 作业限制。b/111569265
  • 修复了 ConstraintTracker 中的 ConcurrentModificationExceptionb/112272753
  • Data.getBooleanArray(String)Data.getIntArray(String) 的返回类型注释更改为 @Nullable 而不是 @NonNullb/112275229

API 更改

  • Worker 现在扩展了一个新类 NonBlockingWorker。这不会影响任何当前的用法。将来,NonBlockingWorker 将成为自定义线程解决方案完全支持的实体。
  • Data.getBooleanArray(String)Data.getIntArray(String) 的返回类型注释更改为 @Nullable 而不是 @NonNullb/112275229
  • Kotlin 扩展程序:弃用了 Map.toWorkData() 而添加了顶级 workDataOf(vararg Pair<String, Any?>),以便与现有 API 更加一致。

2018 年 8 月 10 日

发布了 Navigation 1.0.0-alpha05,该版本修复了一些问题。

问题修复

  • 修复了导致返回栈行为不正确的错误。b/111907708
  • 修复了 Generated Args 类的 equals() 中的错误。b/111450897
  • 修复了 Safe Args 中的构建错误。b/109409713
  • 修复了从资源标识符到 java 名称的转换问题。b/111602491
  • 修复了 Safe Args 插件中有关为空性的错误消息。
  • 添加了缺少的为空性注释。

2018 年 8 月 1 日

WorkManager

发布了 WorkManager 1.0.0-alpha06,该版本修复了一些问题。

问题修复

2018 年 7 月 24 日

WorkManager

发布了 WorkManager 1.0.0-alpha05,该版本修复了一些重大问题并进行了一些日志记录更改。

API 更改

  • WorkManager.getInstance() 现在带有 @NonNull 而不是 @Nullable 注释。如果在手动初始化的情况下未正确初始化单一实例,则该方法将抛出 IllegalStateException这是一项重要的 API 更改。
  • 添加了一个新的 API Configuration.Builder.setMinimumLoggingLevel(int),它可以控制 WorkManager 的详细程度。默认情况下,WorkManager 会记录 Log.INFO 及更高版本。
  • 更改了 Data.getString() 的签名,因此它不再采用默认值(隐式为 null)。这是一项重要的 API 更改。
  • 将需要的某些仅供内部使用的方法标记为 @hide。其中包括 Constraints 构造函数 Data.toByteArray()Data.fromByteArray(byte[])这是一项重要的 API 更改。

问题修复

  • 在已知的自动备份情况下,WorkManager 不再执行工作。这可能会导致出现崩溃。b/110564377
  • 修复了使用 JobScheduler 时的 PeriodicWorkRequest 双重调度问题。b/110798652
  • 修复了在设备低电耗模式后 PeriodicWorkRequest 无法正确执行的问题。b/111469837
  • 修复了使用 Firebase JobDispatcher 时初始延迟的问题。b/111141023
  • 修复了一些潜在的竞争条件和时间问题。
  • 正确释放了不再需要的 BroadcastReceiver
  • 优化了应用在强制关闭后重启时的重新调度性能。
  • 允许在将给定的 WorkRequest 加入队列之前或之后调用 TestScheduler.setAllConstraintsMet(UUID)b/111238024

重要更改

  • WorkManager.getInstance() 现在带有 @NonNull(而不是 @Nullable)注释。
  • 更改了 Data.getString() 的签名,因此它不再采用默认值(隐式为 null)。
  • 将需要的某些仅供内部使用的方法标记为 @hide。其中包括 Constraints 构造函数 Data.toByteArray()Data.fromByteArray(byte[])

2018 年 7 月 19 日

Navigation 1.0.0-alpha04 和关联的 Safe Args Gradle 插件包含多项 API 更改、行为更改和问题修复。

API/行为更改

  • NavHostFragment 会始终将当前的 Fragment 设置为主要导航 Fragment,从而确保在弹出外部 NavController 之前弹出子 Fragment 管理器 b/111345778

Safe Args

  • 重要更改app:type 已更改为 app:argType,以避免与其他库(如 ConstraintLayout 2.0.0-alpha1)发生冲突 b/111110548
  • 来自 Safe Args 的错误消息现在可供点击 b/111534438
  • Args 类现在确认 NonNull 属性实际上不是 null b/111451769
  • 向 NavDirections 和 Args 生成的类添加了额外的 NonNull 注释 b/111455455 b/111455456

问题修复

  • 修复了深层链接到 Fragment 目标后系统返回按钮的问题 b/111515685

2018 年 7 月 12 日

Navigation 1.0.0-alpha03 和关联的 Safe Args Gradle 插件包含多项 API 更改、行为更改和问题修复。

API/行为更改

  • 为工具栏添加了 NavigationUI.setupWithNavController 方法 b/109868820
  • 为 CollapsingToolbarLayout 添加了 NavigationUI.setupWithNavController 方法 b/110887183
  • 当返回栈为空或给定的目标 ID 不在返回栈中时,popBackStack() 现在返回 false b/110893637
  • FragmentNavigator 现在会在 FragmentManager 保存状态后忽略导航操作,从而避免出现“在 onSaveInstanceState 后无法执行此操作”异常 b/110987825

Safe Args

  • 重要更改:操作和参数名称中的非字母数字字符将替换为各自 NavDirections 方法名称中的驼峰式大小写格式
    • 例如,DemoController.index 将变为 setDemoControllerIndex b/79995048
    • 例如,action_show_settings 将变为 actionShowSettings b/79642240
  • 重要更改:默认情况下,现在将参数视为非 null。要允许字符串和 Parcelable 参数具有 null 值,请添加 app:nullable="true" b/79642307
  • 您现在可以采用“123L”的形式对 app:type="long" 与默认值使用 b/79563966
  • 现在支持 Parcelable 参数,并使用 app:type 的完全限定类名。支持的唯一一个默认值是 "@null" b/79563966
  • Args 类现在实现 equals()hashCode() b/79642246
  • Safe Args 插件现在可以应用于库项目 b/80036553
  • Safe Args 插件现在可以应用于功能项目 b/110011752

问题修复

  • 修复了在 Fragment 生命周期方法期间导航时出现的问题 b/109916080
  • 修复了在多次导航嵌套图表时出现的问题 b/110178671
  • 修复了在将 setPopUpTo 与图表中的第一个目标一起使用时出现的问题 b/109909461
  • 修复了将所有 app:defaultValue 值作为字符串传递的问题 b/110710788
  • 与 Android Gradle Plugin 3.2 Beta 01 捆绑在一起的 aapt2 现在为导航 XML 文件中的每个 android:name 属性添加了保留规则 b/79874119
  • 修复了在更换默认的 FragmentNavigator 时出现的内存泄漏问题 b/110900142

2018 年 7 月 2 日

AndroidX 版本的 Lifecycle、Room 和 Paging 发布了版本 2.0.0-beta01

Lifecycle

问题修复

  • 修复了 LifecycleObserver ProGuard 规则以仅保留实现而不保留子接口 b/71389427
  • 修复了 ViewModel ProGuard 规则以允许混淆和压缩

Room

API/行为更改

  • 添加了 RoomDatabase.Builder.setQueryExecutor() 以允许自定义查询运行位置
  • 添加了 RxJava2 Observable 支持
  • 生成的 DAO 和数据库实现现在是最终实现

问题修复

  • 在“找不到字段的 getter”错误中指定类/字段名称 b/73334503
  • 修复了 RoomOpenHelper 与较低版本的 Room 的向后兼容性问题 b/110197391

Paging

问题修复

  • 修复了在某些前置情况下(占位符已停用,PositionalDataSource)内容消失的问题 b/80149146
  • (在 1.0.1 中已发布)修复了导致 PagedListAdapterAsyncPagedListDiffer 无法发出移动事件信号的崩溃问题 b/110711937

2018 年 6 月 26 日

Paging

发布了 Paging 1.0.1,该版本修复了 runtime 过程中的一个错误。为了保持稳定性,我们强烈建议使用 1.0.1。还发布了 Paging RxJava2 1.0.1,它与 1.0.0-rc1 完全相同。

问题修复

  • 修复了导致 PagedListAdapterAsyncPagedListDiffer 无法发出移动事件信号的崩溃问题。b/110711937

WorkManager

发布了 WorkManager 1.0.0-alpha04

问题修复

  • 当使用基于 AlarmManager 的实现时,现在可以正确地重新调度 PeriodicWorkRequest

  • 修复了在强行停止或重新启动后重新调度所有 Worker 线程时出现的潜在 ANR 问题。b/110507716

  • 向各种 WorkManager API 添加了为空性注解。b/110344065

  • 记录在 Worker 线程执行期间发生的未捕获异常。b/109900862

  • 在您决定回滚到较低版本的 WorkManager 时,允许进行破坏性数据库迁移。b/74633270

  • 修复了在创建重复隐式标记时出现的迁移崩溃问题。这是一个很少见的问题,只有在您自己使用相同的隐式标记格式时才会发生。

2018 年 6 月 19 日

Room

发布了 Room 1.1.1。此版本与 Room 1.1.1-rc1 完全相同。

WorkManager

发布了 WorkManager 1.0.0-alpha03

问题修复

  • 修复了基于 AlarmManager 的实现中的竞争条件问题。b/80346526

  • 修复了在设备重新启动后使用 JobScheduler 时出现的重复作业问题。

  • 具有内容 URI 触发器的作业现在可以在系统重新启动后保留。b/80234744

  • 文档更新。b/109827628b/109758949b/80230748

  • 修复了在将 WorkRequest 重新加入队列时出现的崩溃问题。b/109572353

  • 修复了在使用 work-runtime-ktx 依赖项时出现的 Kotlin 编译器警告。

  • WorkManager 现在使用 Room 1.1.1-rc1

API 更改

  • 添加了 getStatusesSync(),即 WorkContinuation.getStatuses() 的同步版本。

  • Worker 能够区分用户发起的取消和操作系统请求的临时停止。如果已请求任何类型的停止,Worker.isStopped() 将返回 true。已显式取消 Worker 线程后,Worker.isCancelled() 将返回 trueb/79632247

  • 在 API 28 上添加了对 JobParameters#getNetwork() 的支持。这通过 Worker.getNetwork() 公开。

  • 添加了 Configuration.Builder.setMaxSchedulerLimit(int maxSchedulerLimit),这样便可强制规定可以将多少作业发送到 JobSchedulerAlarmManager。这有助于防止 WorkManager 占用所有可用的 JobScheduler 插槽。

  • 添加了 Configuration.setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId),它有助于定义 WorkManager 尽可放心使用的一系列 JobScheduler 作业 ID。b/79996760

  • Worker.getRunAttemptCount() 返回给定 Worker 的当前运行计数。b/79716516

  • 通过 WorkManager.enqueueUniquePeriodicWork(String uniqueWorkName, ExistingPeriodicWorkPolicy existingPeriodicWorkPolicy, PeriodicWorkRequest periodicWork),可以将唯一的 PeriodicWorkRequest 加入队列。b/79600647

  • WorkManager.cancelAllWork() 会取消所有 Worker。依赖于 WorkManager 的库可以使用 WorkManager.getLastCancelAllTimeMillis() 查询上次调用此方法的时间,以便对内部状态进行额外的清理。

  • 添加了 WorkManager.pruneWork() 以从内部数据库中移除完成的作业。b/79950952b/109710758

行为更改

  • 为所有 WorkRequest 添加了一个隐式标记,它是 Worker 的完全限定类名。这样便能够在没有 tag 的情况下或在 id 不可用时移除 WorkRequestb/109572351

重要更改

  • Worker.WorkerResult 重命名为 Worker.Result

  • Worker.onStopped 现在有一个额外的 isCancelled 参数,已显式取消 Worker 后,该参数将设置为 true

2018 年 6 月 7 日

发布了 Navigation 1.0.0-alpha02

行为更改

  • FragmentNavigator 现在使用 setReorderingAllowed(true)b/109826220

  • Navigation 现在对从深层链接网址解析的参数执行 URLDecode 操作。b/79982454

问题修复

  • 修复了在从 Fragment 生命周期方法调用 Navigation 时出现的 IllegalStateExceptionb/79632233

  • Navigation 现在依赖于 Support Library 27.1.1 来修复使用动画时的闪烁问题。b/80160903

  • 修复了在使用 defaultNavHost="true" 作为子 Fragment 时出现的 IllegalArgumentExceptionb/79656847

  • 修复了在使用 NavDeepLinkBuilder 时出现的 StackOverflowErrorb/109653065

  • 修复了在导航回嵌套图表时出现的 IllegalArgumentExceptionb/80453447

  • 修复了在使用 launchSingleTop 时 Fragment 重叠的问题。b/79407969

  • Navigation 现在可以为嵌套图表构建正确的合成返回栈。b/79734195

  • 当使用嵌套图表作为 MenuItem 时,NavigationUI 现在会突出显示正确的项。b/109675998

API 更改

  • 已弃用操作的 clearTask 属性以及 NavOptions 中的关联 API。b/80338878

  • 已弃用操作的 launchDocument 属性以及 NavOptions 中的关联 API。b/109806636

2018 年 5 月 24 日

发布了 WorkManager 1.0.0-alpha02

WorkManager

问题修复

  • 修复了在 State.isFinished() 时出现的 NullPointerExceptionb/79550068

  • 修复了导致在 Application.onCreate() 时重新调度 Worker 的问题。b/79660657

  • 修复了您可以调度的作业数超过操作系统允许的作业数的问题。b/79497378

  • 将与 Worker 关联的唤醒锁定的清理工作移到了后台线程。

  • 当所有待处理的作业完成时,AlarmManager 实现现在可以正确清理。

  • 修复了会影响非英语语言区域的清理 SQL 查询。b/80065360

  • Data 中添加了对 float 的支持。b/79443878

  • Data.Builder.putAll() 现在返回 Builder 的实例。b/79699162

  • 文档中介绍了更多 javadoc 和修复程序。b/79691663

API 更改

  • Worker 可以对停止做出响应。Worker.isStopped() 可用于检查 Worker 是否已停止。Worker.onStopped() 可用于执行轻量级清理操作。

  • Worker.getTags() API 将返回与 Worker 关联的标记 Set

  • 为 API 添加了 javax.time.Duration 过载,它接受时长和 TimeUnit 的组合。受 @RequiresApi(26) 保护。

  • WorkManager 扩展已从 androidx.work.ktx 软件包移至 androix.work 软件包。旧的扩展已弃用,将在以后的版本中移除。

  • Configuration.withExecutor() 已弃用。请改用 Configuration.setExecutor()

2018 年 5 月 16 日

发布了 Paging RxJava2 1.0.0-rc1 和 Room 1.1.1-rc1。如果您使用迁移功能,强烈建议您使用 Room 1.1.1-rc1 而不是 1.1.0

Room

修复了 Room 无法正确处理迁移后初始化的错误 b/79362399

Paging

Paging rxjava2 即将迁移到候选版本,该版本与初始 alpha 版本相比没有变化。

2018 年 5 月 8 日

Paging 1.0、Navigation 和 WorkManager alpha 版、Room 1.1 以及 AndroidX

发布了 Paging 1.0.0Room 1.1.0,以及两个新的架构组件(即 Navigation 和 WorkManager)的 alpha 版。

自最新发布的候选版本以来,Paging 和 Room 没有任何变化。

新库:Navigation

Navigation 可以提供用于构建应用内导航的框架。此初始版本为 1.0.0-alpha01

新库:WorkManager

WorkManager 可以简化有保证的约束感知型后台工作的调度和执行。此初始版本为 1.0.0-alpha01

AndroidX

架构组件正在成为 AndroidX 的一部分,包括更新的软件包名称、软件工件名称以及对其他 AndroidX 库的依赖关系。这些是在 2.0.0-alpha1 版本下发布的,可与其他 AndroidX 库结合使用。

Kotlin 扩展

ViewModel、ReactiveStreams 和 Sqlite(以前是 Room 的“数据库”组件)全部都添加了 Kotlin 扩展库(作为 AndroidX alpha 版本的一部分)。此外,Navigation 和 WorkManager 包括 -ktx 模块。其中每个扩展模块均可在添加组件中找到。

2018 年 5 月 2 日

  • Room 1.1.0 候选版本
  • 发布了 Room 1.1.0-rc1

问题修复

  • Room 现在与 Kotlin 1.2.40 兼容。b/78328708

2018 年 4 月 19 日

Paging 候选版本

发布了 Paging 1.0.0-rc1 和 Room 1.1.0-beta3

Paging

我们没有关于 Paging 1.0.0 版本的任何其他已知问题,也没有为其安排新功能。请升级您的项目以使用 1.0.0-rc1 并帮助我们对其进行严格的测试,以便我们可以推出稳定可靠的 1.0.0

此版本没有任何变化,它与 1.0.0-beta1 相同。

Room

问题修复

  • 修复了当 Kotlin POJO 引用用 Java 定义的关系实体时出现的编译错误 b/78199923

2018 年 4 月 5 日

发布了 Room 1.1.0-beta2、Paging 1.0.0-beta1 和 Paging RxJava 1.0.0-alpha1

在成为候选版本之前,Paging 将在测试阶段进行短时间的测试。我们不计划对 Paging 1.0 做出进一步的 API 更改,并且任何 API 更改的标准都非常高。

Alpha RxJava2 对 Paging 的支持作为一个单独的可选模块 (android.arch.paging:rxjava2:1.0.0-alpha1) 发布,并且将暂时单独版本化,直到它稳定为止。

此新库提供了 RxJava2 来替代 LivePagedListBuilder,能够构造 ObservableFlowable,接受 Scheduler 而不是 Executor

Observable<PagedList<Item>> pagedItems =
        RxPagedListBuilder(myDataSource, /* page size */ 50)
                .setFetchScheduler(myNetworkScheduler)
                .buildObservable();

Paging

新功能

  • 通过新的 android.arch.paging:rxjava2 软件工件添加了 RxPagedListBuilder

API 更改

  • 进行了 API 更改,以阐明执行器在构建器中的作用:

    • setBackgroundThreadExecutor() 重命名为 setFetchExecutor()(在 PagedList.BuilderLivePagedListBuilder 中)。

    • setMainThreadExecutor() 重命名为 setNotifyExecutor()(在 PagedList.Builder 中)。

  • 修复了 PagedList.mCallbacks 成员,使其成为专用成员。

问题修复

  • LivePagedListBuilder 将在指定的执行器上而不是在架构组件 IO 线程池中触发初始 PagedList 加载。

  • 修复了内部 DataSource 封装容器(用于实现 DataSource.map 以及停用了占位符的 PositionalDataSource 加载)中的失效行为 b/77237534

Room

问题修复

  • 修复了 Room 的 Rx SingleMaybe 实现中的一个关键错误,该错误将提前回收查询,导致在向返回的 SingleMaybe 实例添加多个观察者时出现问题。 b/76031240

  • 如果在事务内调用 RoomDatabase.clearAllTables,它不会对数据库执行 VACUUM 操作。 b/77235565

2018 年 3 月 21 日

发布了 Room 1.1.0-beta1、Paging 1.0.0-alpha7 和 Lifecycles 1.1.1

Room

API 更改

问题修复

  • RoomDatabase.clearAllTables 现在通过设置 WAL 检查点和对数据库执行 VACUUM 操作,尝试将空间返还给操作系统。

  • @RawQuery 现在接受 observedEntities 属性的任何 Pojo,前提是该 Pojo 通过其 Embedded 字段或 Relation 引用一个或多个实体。 b/74041772

  • Paging:Room 的 DataSource 实现现在可以正确处理多表依赖项(如关系和连接)。以前,这些将无法触发新结果,或者可能无法编译。 b/74128314

Lifecycles

只有一项小小的更改:android.arch.core.util.Function 已从 arch:runtime 移至 arch:common。这样,便可以在没有运行时依赖项的情况下使用它,例如在下面的 paging:common 中。

lifecycle:commonlifecycle:runtime 的依赖项,所以此更改不会直接影响 lifecycle:runtime,而只会影响像 Paging 一样直接依赖于 lifecycle:common 的模块。

Paging

发布了 Paging 1.0.0-alpha7 以及 Lifecycles 1.1.1。由于 Paging alpha7 依赖于上述 Function 类的移动,因此您需要将 lifecycle:runtime 依赖项更新为 android.arch.lifecycle:runtime:1.1.1

在 Paging 进入测试阶段之前,计划将 Paging alpha7 作为最终版本。

API 更改

  • DataSource.LoadParams 对象现在具有一个公开构造函数,而 DataSource.LoadCallback 对象现在是抽象对象。这样,便可以封装 DataSource 或通过模拟回调直接测试 DataSourceb/72600421
  • DataSource 和 DataSource.Factory 的映射器
    • 通过 map(Function<IN,OUT>),可以转换、封装或修饰由 DataSource 加载的结果。
    • mapByPage(<List<IN>,List<OUT>>) 可以为批处理启用相同的功能(例如,如果从 SQL 加载的项需要另外查询一个单独的数据库,则可以采用批处理的方式完成该操作)。
  • 以便捷方法的形式添加了 PagedList#getDataSource() b/72611341
  • 所有已弃用的类都已从 API 中移除,包括 recyclerview.extensions 软件包的剩余内容和 LivePagedListProvider
  • DataSource.Factory 从接口更改为抽象类以启用映射功能。

问题修复

  • 已将构建器更改为最终版本。 b/70848565
  • Room DataSource 实现现已得到修复,能够处理多表查询 - 此修复包含在 Room 1.1.0-beta1 中,参见上文。
  • 修复了在启用占位符后且总大小为页面大小的整数倍时无法为 PositionalDataSource 调用 BoundaryCallback.onItemAtEndLoaded 的错误。

2018 年 3 月 2 日

发布了 Room 1.1.0-alpha3。这是计划的最后一个 Room 1.1.0 alpha 版本。

API 更改

  • InvalidationTrackeraddObserverremoveObserver 方法现已同步,并且需要在非界面线程上调用。这样可防止在观察表格时出现一些竞争条件。

  • RoomDatabase 类有了一个新的 clearAllTables() 方法,该方法可截断所有表格内容。 b/63807999

  • SupportSQLiteQuery 现在有一种 getArgCount() 方法,该方法可返回查询参数的数量。 b/67038952

问题修复

  • Paging 查询现在正确支持 @RawQueryb/72600425

  • 当两个或更多 Dao 接口是同一软件包中的内部类且具有相同的名称时,Room 现在可以正确命名生成的 Dao 类以避免名称冲突。 b/73536380

  • Pojo 中的通用字段类型正确解析为扩展类的成员。 b/73534868

  • 现在可以正确解析从依赖项软件工件继承的 Dao 接口中的查询参数。 b/68118746

  • @Relation 生成的查询现在可以正确转义字段名称。 b/70925483

2018 年 2 月 27 日

发布了 Paging 1.0.0-alpha6 以及 Support Library 27.1.0。 ListAdapter 和一些相关的类已从 Paging 库直接移至 Recyclerview,同时还重命名了一些类,以使某些类的功能更加清晰。此 Paging alpha 版本很可能是对 API 进行重要更改的最后一个版本。

API 更改

  • 已移至 recyclerview-v7 的类:
    • ListAdapter
  • 已重命名且移至 recyclerview-v7 的类:
    • ListAdapterHelper -> AsyncListDiffer
    • ListAdapterConfig -> AsyncDifferConfig
    • DiffCallback -> DiffUtil.ItemCallback
  • 在 paging-runtime 中已重命名的类:
    • PagedListAdapterHelper -> AsyncPagedListDiffer

移动的类与 RecyclerView 在一起很有用,独立于 Paging 库。这意味着,可以在不依赖于 Paging alpha 版本的情况下使用它们;但也意味着,使用 Paging 的应用必须同时升级到 Alpha 6 和 Support Library 27.1.0。

** Paging Alpha6 的迁移指南:**

  • 将 Paging 和 RecyclerView 依赖项更新为 android.arch.paging:runtime:1.0.0-alpha6com.android.support:recyclerview-v7:27.1.0
    • 这些必须同时完成,因为 ListAdapter 已从 Paging 移至 RecyclerView
  • ListAdapterHelper 的所有引用更新为 AsyncListDiffer
    • 已移除 getItem(index)/getItemCount(),取而代之的是调用更明确的 getCurrentList().getItem(index)getCurrentList().size() 的模式。
  • ListAdapterConfig 的所有引用更新为 AsyncDifferConfig
  • DiffCallback 的所有引用更新为 DiffUtil.IttemCallback
  • PagedListAdapterHelper 的所有引用更新为 AsyncPagedListDiffer
  • setList() 的引用更新为 submitList()
    • 进行了重命名,以阐明列表差异的异步性质

问题修复

  • 修复了停用占位符后将错误的初始位置传递给初始加载的问题。b/73513780

2018 年 2 月 15 日

发布了 Room 1.1.0-alpha2

新功能

  • Room 现在支持在预写日志模式下打开数据库。在这种模式下,您的写入将不再阻止您的读取查询。虽然消耗更多内存(由于存在多个连接),但是这种模式通常更快。默认情况下,如果设备是 API 16 或更高版本且不是低内存设备,则 Room 将使用 WAL。您可以使用 RoomDatabase.Builder 上的 setJournalMode() 方法控制此行为。 b/67757002

  • Guava 支持:Room 现在支持在 DAO 查询中返回 Guava Optional<T>ListenableFuture<T>。要使用 ListenableFuture<T>,您需要从 Room 导入 guava 软件工件 (android.arch.persistence.room:guava:1.1.0-alpha2)。

  • Room 现在支持从 DAO 查询返回 java.util.Optional<T>

  • DAO 类中的 @Transaction 方法现在支持具有默认实现的接口方法。这同时适用于 Java 8Kotlinb/72416735

问题修复

  • 如果存在可使用的其他构造函数,带有 @Relation 的构造函数不会导致编译错误。 b/72884434

  • 现在可以为失效跟踪器正确转义在 @Query 方法中使用 ' 转义的表格名称。 b/72366965

  • 在注解处理过程中,Room 现在使用 Kotlin @Metadata 注解读取类结构。这意味着,即使 Pojo 是从依赖项继承的,也可以正确读取其构造函数参数名称。 b/67181813

  • 修复了查找降级迁移路径的问题。 b/72153525

  • 从现有数据库迁移到 Room 时,现在可以正确处理非默认列类型。 b/71953987

  • Room 现在可以正确处理 Kotlin 类中的持久性 boolean? 字段。 b/72786402

2018 年 1 月 22 日

发布了 Lifecycle 1.1.0、Room 1.1.0-alpha1 和 Paging 1.0.0-alpha5

Lifecycle 1.1.0

打包更改

现在可使用小得多的新增依赖项:

  • android.arch.lifecycle:livedata:1.1.0
  • android.arch.lifecycle:viewmodel:1.1.0

API 更改

  • 已弃用的 LifecycleActivityLifecycleFragment已移除 - 请使用 FragmentActivityAppCompatActivity 或支持 Fragment
  • @NonNull 注解已添加到 ViewModelProvidersViewModelStores
  • ViewModelProviders 构造函数已弃用 - 请直接使用其静态方法
  • ViewModelProviders.DefaultFactory 已弃用 - 请使用 ViewModelProvider.AndroidViewModelFactory
  • 已添加 ViewModelProvider.AndroidViewModelFactory.getInstance(Application) 静态方法,用于检索适合创建 ViewModelAndroidViewModel 实例的静态 Factory

Room 1.1.0-alpha1

新功能

  • RawQuery:这一新 API 允许 @Dao 方法接收 SQL 作为查询参数 b/62103290b/71458963
  • fallBackToDestructiveMigrationsFrom:通过 RoomDatabase.Builder 中的这一新 API,可以更精细地控制允许从哪些起始架构版本进行破坏性迁移(与 fallbackToDestructiveMigration 相比)b/64989640
  • Room 现在仅支持较新的 Paging API (alpha-4+),不再支持已弃用的 LivePagedListProvider。要使用新的 Room alpha 版,您需要使用 Paging alpha-4 或更高版本,并从 LivePagedListProvider 切换到 LivePagedListBuilder(如果尚未切换)。

问题修复

  • 改进了对 Kotlin Kapt 类型的支持。b/69164099
  • 字段的顺序不再使架构无效。b/64290754

Paging 1.0.0-alpha5

问题修复

  • 修复了停用占位符后的页面加载问题 b/70573345
  • 添加了跟踪 IllegalArgumentException 错误的日志记录 b/70360195(以及推测性 Room 端修复)
  • 修复了 Javadoc 示例代码 b/70411933b/71467637

2017 年 12 月 11 日

发布了 Paging alpha4-1。这是 Paging alpha 4 的一个小错误修复版本。

问题修复

2017 年 12 月 7 日

发布了 Paging alpha4,该版本主要针对网络和网络 + 数据库用例进行了重要更改并添加了一些内容。

API 更改

  • DataSource 现在是一个异步 API,使直接从网络进行分页更容易:

    • 初始大小和数据的单一入口点
    • 通过暂挂回调并稍后分派来支持网络重试
    • 线程安全回调允许异步加载,以便在界面线程上创建单一网络支持的 PagedList
    • 与初始加载参数有关的错误行为更清晰
  • TiledDataSource 重命名为 PositionalDataSource 以反映其基于位置的索引,以及在停用占位符后不会平铺的事实。

  • 添加了 PageKeyedDataSource 以支持嵌入网络页面加载的下一个/上一个令牌。KeyedDataSource 重命名为 ItemKeyedDataSource 以区分清楚。

  • LivePagedListBuilderDataSource.Factory 取代了 LivePagedListProvider。LivePagedListBuilder 可提供相同的功能,但具有更多自定义项和更简单的默认值。DataSource.Factory 允许 DataSource 生成代码保持独立于 LiveData

  • 针对数据库 + 网络用例添加了 PagedList.BoundaryCallback

  • PagedList.Builder 构造函数接受 DataSource + PagedList.Config,现在更类似于 LivePagedListBuilder,并允许使用 Java 语言中的菱形操作符或 Kotlin 中的推断类型。

  • 添加了 PagedList.getConfig(),并且 PagedList.Config 现在具有公开成员属性。

  • KeyedDataSource.loadBefore() 不再要求反转结果。

  • 添加了 PagedListAdapter.onCurrentListChanged() 以监听显示 PagedList 时所基于的更新。

问题修复

  • 修复了 PagedListAdapter(Helper) 中的 IndexOutOfBoundsException b/67883658

1.0.0 - 2017 年 11 月 6 日

所有主要组件(Paging 除外)现在都是 1.0.0。除了对 reactivestreams 库进行了一项更改之外,此版本与 rc1 完全相同。

问题修复

候选版本 - 2017 年 10 月 18 日

所有主要软件工件(Paging 除外)现在都是 1.0.0-rc1

我们没有关于 1.0.0 版本的任何其他已知问题,也没有计划为其推出新功能。请升级您的项目以使用 1.0.0-rc1 并帮助我们对其进行严格的测试,以便我们可以推出稳定可靠的 1.0.0

行为更改

  • 在此版本中,当调用 onSaveInstanceState 时,现在会分派 Lifecycle.Event#ON_STOP(以前,只是将其标记为 CREATED 而不分派 ON_STOP)。您可以在 Lifecycles 文档中了解详情。

问题修复

  • Room:

    • Room 现在依赖于最新的 xerial 软件工件,该软件工件修复了编译期间的 OutOfMemory 问题。 b/62473121
    • Query 方法现在可以带有 @Transaction 注解。详情请参阅 @Transaction 的参考文档b/65112315
    • Room 中的 StringUtil 类已从公共 API 中移除(从未打算将其用作公共 API)。
  • Lifecycles:

    • 当小于 24 的 API 部分涵盖 Activity 时,LiveData 可以正常工作。 b/65665621

    • 现在可以正确调用父类中的 OnLifecycleEvent 方法;或者,如果无法调用,则会在编译期间输出警告。 b/63474615

    • Lifecycle 现在持有对其 LifecycleOwnerWeakReference,以免当 Lifecycle 留在内存中的时间比往常长时泄漏 LifecycleOwner(这只是一项预防措施,您还是应该小心,不要泄漏 Lifecycle)。

2017 年 10 月 9 日

发布了 Paging alpha-3,此次发布使其与 Lifecycles 和 Room 的 beta 2 版本兼容。

问题修复

  • 改进了 Paging 文档。

2017 年 10 月 5 日

所有主要软件工件(Paging 除外)现在都是 beta 2。此次没有发布新版本的 Paging。

问题修复

  • Lifecycles:

    • LiveData 未处于活跃状态时,LiveDataReactiveStreams 现在可以正确地从源发布者取消订阅。 b/62609183
    • 当父类来自另一个模块时,Lifecycle 事件会正确地传播到父类。 b/63474615
    • 当观察者在订阅创建期间取消订阅时,LiveData 会正确处理观察者。 b/66337741
    • 现在,依赖项树中提供了 Java 8 语言软件工件的 FullLifecycleObserverb/66525578

    • 对于 ProGuard,请将以下行添加到 ProGuard 文件。(当 1.0.0 正式推出时,不再需要执行此操作。)

      • -keep class * implements android.arch.lifecycle.GeneratedAdapter {<init>(...);}
  • Room:

    • @Query 方法中返回的 Pojo 的 @NonNull 字段与查询响应中的任何列都不匹配时,Room 现在会在编译时输出错误。如果该字段为 @Nullable,则 Room 仅输出警告。 b/67115337
    • Room 现在会验证较新操作系统版本中的索引。 b/63132683
    • 如果 Pojo 中存在多个匹配的构造函数,则 Room 默认情况下会选取无参构造函数。 b/67353427
    • 如果单列主键为 IntegerLong,则它们可以为 Nullableb/67086876
    • 失效跟踪器会在测试模式下正确处理重新输入。 b/65471397
    • Room 现在会在编译时检查列和表格名称中是否存在无效字符(无效字符:`")。 b/64749111

2017 年 9 月 21 日

在此版本中,所有架构组件模块都至少达到 beta 1(新的 Paging Library 除外,它是 alpha 2)。

我们不计划再进行任何 API 更改。可能会发生计划外更改,但在 1.0.0 稳定之前更改任何 API 的标准都非常高且不太可能发生。

  • 1.0.0 稳定之前,将移除 LifecycleActivity 和 LifecycleFragment。使用 Support Library 26.1.0 或更高版本时,不需要这些组件。

与 alpha 阶段不同,beta 阶段计划的持续时间非常短。

版本更改

  • Lifecycle Extensions 和 Room 现在是 beta 1
  • Paging 现在是 alpha 2
  • Lifecycles(runtime 和 common)与 Arch Core (common) 没有变化。自 9 月 13 日以来,这两个软件工件都是 1.0.0 版本。

新的软件工件

  • Lifecycles 现在有一个名为 common-java8 的新软件工件。该软件工件包含一个名为 DefaultLifecycleObserver 的新接口,它具有所有 Lifecycle 方法的默认实现。如果您使用的是 Java 8 语言,则应该优先使用此软件工件而不是注解。

    • 由于 beta1 中存在错误,因此您需要添加对 android.arch.lifecycle:common:1.0.1 模块的显式依赖性,才能使用新的 common-java8 软件工件。此问题将在 beta2 中修复。

打包更改

  • android.arch.persistence.room.db 已移至 android.arch.persistence.db
  • android.arch.persistence.room.db-impl 已移动且重命名为 android.arch.persistence.db-framework

这两个软件工件都已经依赖于 Room,所以除非您直接使用它们,否则应该不需要更改编译文件中的任何内容。

API 更改

  • Room:

    • @ColumnInfo 注解现在支持在列上设置排序规则。 b/62007004
    • 现在,默认情况下会忽略 transient 字段,除非它们带有 @ColumnInfo@Embedded@Relation 注解。 b/62600692
    • 主键必须带有 @NonNull 注解,除非它们是自动生成的。 b/64292391
      • 此更改可能需要架构迁移。对由此带来的不便,我们深表歉意。
    • 添加了一个方便的新注解 (@Transaction),该注解替换了 DAO 方法并在事务内运行它。
  • 支持 SQLite 数据库:

  • Paging:

    • 通过添加示例和线程注解改进了 Paging 文档。

问题修复

  • Room:
    • @Query 方法中的 Kotlin 多行字符串得到正确处理。 b/65809374
  • Paging:
    • Paging 软件工件不再依赖于 junit。 b/65690261

1.0.0 Alpha 9-1 - 2017 年 9 月 13 日

这是一个主要版本,其中 core lifecycle 软件工件(runtime 和 common)与 arch core (common) 已达到稳定版本 1.0.0

随着此更改,Support Library 26.1.0 现在依赖于这些库。AppCompatActivitySupport Fragment 现在都实现 LifecycleOwner 接口。

此版本还依赖于 Support Library 26.1.0 以利用新的集成。

新库:Paging

此版本还包括一个名为 Paging 的新库,使用该库可在必要时以区块的形式轻松地将大型数据集加载到 RecyclerView。发布的 Paging 版本为 alpha1,它将具有自己的发布周期。

API 更改

问题修复

  • 如果应用在类路径中具有相应的注解,则生成的类现在带有 @Generated 注解。 b/35754819

  • 修复了 MediatorLiveData 的观察者比较错误。 b/64413274

  • [LiveData] 现在支持 SQLite WITH 查询。[ref-LiveData] b/62510164

  • 修复了在观察到超过一个表格时 InvalidationTracker 无法发送正确列表的错误。b/65099281

  • 修复了 Room 在 Windows 系统上生成不同文件的错误。 b/64470691

  • 现在支持根目录软件包中的 LifecycleObserver。 b/62310817

1.0.0 Alpha 9 - 2017 年 8 月 16 日

问题修复

  • 修复了 LiveData 中的一个错误:在将第一个观察者从其 onChanged 方法中移除后会忽略第二个观察者b/64285805

1.0.0 Alpha 8 - 2017 年 8 月 1 日

行为更改

  • 为基元类型的列或带有 NonNull 注解的列添加了 NOT NULL 约束。这样会更改表格的结构,所以如果您已在使用架构组件 alpha 7 或更低版本,那么要保留数据,则需要实现迁移,或者使用构建器中的 fallbackToDestructiveMigration() 方法。b/62007004

API 更改

1.0.0 Alpha 7 - 2017 年 7 月 26 日

问题修复

1.0.0 Alpha 6 - 2017 年 7 月 25 日

行为更改

  • LifecycleObserver 调用的顺序已更改。以前,总是按照观察者的添加顺序调用观察者:如果 observer1observer2 之前添加,则它将在 observer2 之前接收 ON_CREATE 以及其他所有事件。销毁事件不再是这种情况,对于此类事件,调用观察者的顺序与添加的顺序相反。所以,当前的行为是:如果 observer1observer2 之前添加,则 ON_CREATE 会先发送到 observer1,再发送到 observer2(对于 ON_STARTON_RESUME 同样如此),但 ON_PAUSE 事件会先发送到 observer2,之后才会发送到 observer1(对于 ON_STOPON_DESTROY 同样如此)。

  • 如果缺少迁移,则 Room 会抛出异常。以前,Room 只会清除数据库,但现在它会发生崩溃。开发者可以通过调用构建器 API 来选择清除行为。b/63872392

API 更改

  • RoomDatabase.Builder 添加了 fallbackToDestructiveMigration() 方法,用于在缺少迁移时清除数据库。b/63872392

  • 架构组件现在依赖于 Support Library 26.0.0

问题修复

1.0.0 Alpha 5 - 2017 年 7 月 18 日

API 更改

您需要依赖于 android.arch.persistence.room:rxjava2 软件工件来向 Room 添加 RxJava 支持。

问题修复

  • 修复了没有任何参数的 @Delete 查询问题。b/63608092

  • 修复了 getter 和 setter 的 Room 类型检查。b/63733651

1.0.0 Alpha 4 - 2017 年 7 月 11 日

API 更改

  • RoomDatabase 添加了一种新的便捷方法 (runInTransaction())。

  • @Insert@Delete@Update 方法现在可以具有来自不同实体类型的参数。b/62682405

问题修复

  • 修复了 @Dao 方法中的 byte[] 处理问题。b/62460045

  • Room 中的迁移检查现在使用不区分大小写的比较。b/62875382

  • 修复了 Lifecycles 软件工件的 ProGuard 配置。b/62113696

1.0.0 Alpha 3 - 2017 年 6 月 15 日

API 更改

  • @OnLifecycleEvent 现在仅支持 1 个事件参数。这是为 Java 8 支持做准备而进行的更改,以便我们将来可以迁移到具有默认方法的接口。关于此更改,只有带 @OnLifecycleEvent(ON_ANY) 注解的方法可以接收 Event 类型的第二个参数(第一个参数是 LifecycleOwner)。详情请参阅 Lifecycle 文档。

  • LifecycleActivityLifecycleFragment 类已移入 android.arch.lifecycle:extensions 软件工件。

  • MigrationTestHelper 接收插桩实例而不是 Context,从而能够从测试资源中读取架构,并在应用上下文中创建数据库。

  • Iterable 现在可以作为 @DAO 方法中的 @Insert@Delete@Update 注解的参数类型。b/62259820

问题修复

  • 不再多次调用具有生命周期事件的被覆盖方法。

  • 现在可以正确处理多个 IN 参数。b/62608681

  • 抽象 DAO 类现在可以具有接收 @Database 实例的构造函数。b/38488747

  • DAO 现在可以具有带类型参数的超类/接口。b/62103620

1.0.0 Alpha 2 - 2017 年 6 月 2 日

API 更改

问题修复

  • 为生命周期提供了 ProGuard 文件。(b/62113696)
  • 修复了类型转换器丢失数据的问题。(b/62100716)
  • 允许从 @Insert 查询返回 Long[]

1.0.0 Alpha 1 - 2017 年 5 月 17 日

MinSDK:14

一般建议

  • 虽然我们在发布之前进行了大量测试,但架构组件目前还是 alpha 版。如果您正在构建正式版应用,请注意,API 将在 1.0 版本之前发生更改,并且可能不完全稳健。如果您不愿调试所使用的库中的问题,我们建议您先在副项目中尝试使用架构组件。

  • 我们不建议所有人立即迁移。我们将为 1.0 版本的架构组件准备好迁移指南。

已知限制和问题