【Android Jetpack 使用入门】
【Android 架构组件 Android Jetpack 的一部分。】
Android 架构组件是一组库,可帮助您设计稳健、可测试且易维护的应用。您可以从管理界面组件生命周期和处理数据持久性的类着手。
- 通过应用架构指南,学习有关汇编稳健应用的基础知识。
- 管理应用的生命周期。新的生命周期感知型组件可帮助您管理 Activity 和 Fragment 的生命周期。在配置更改后继续有效、避免内存泄漏,以及将数据轻松加载到界面中。
- 使用 LiveData 构建数据对象,在基础数据库改变时通知视图。
- ViewModel 存储界面相关的数据,这些数据不会在应用旋转时销毁。
- Room 是一个 SQLite 对象映射库。它可用来避免样板代码,还可以轻松地将 SQLite 表数据转换为 Java 对象。Room 提供 SQLite 语句的编译时检查,并且可以返回 RxJava、Flowable 和 LiveData 可观察对象。
** Jetpack有很多部分,这里先整理一下最常用的两个:ViewModel
和 LiveData
**
一、ViewModel
ViewModel 以注重生命周期
的方式存储和管理界面相关的数据,比如让数据可在屏幕旋转等配置更改后继续留存。
类似在 onSaveInstanceState()
处理数据的保存和恢复。
1 | import androidx.lifecycle.ViewModel |
1 | private lateinit var myViewModel: MyViewModel |
这样 num
变量就能在屏幕旋转时自动保存和恢复,单独使用ViewModel
感觉没多大优势,如何配合LiveData
将更加方便。
** Fragment KTX **
引入fragment-ktx
这个扩展库:
1 | implementation "androidx.fragment:fragment-ktx:1.3.3" |
可以更加简洁的创建ViewModel
1 | // Get a reference to the ViewModel scoped to this Fragment |
二、LiveData
LiveData 具有生命周期感知能力观察类,遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
使用 LiveData 的优势:
- 确保界面符合数据状态
- 不会发生内存泄漏
- 不会因 Activity 停止而导致崩溃
- 不再需要手动处理生命周期
- 数据始终保持最新状态
- 适当的配置更改
- 共享资源
请按照以下步骤使用 LiveData 对象:
- 创建 LiveData 的实例以存储某种类型的数据。这通常在 ViewModel 类中完成。
- 创建可定义 onChanged() 方法的 Observer 对象,该方法可以控制当 LiveData 对象存储的数据更改时会发生什么。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中创建 Observer 对象。
- 使用 observe() 方法将 Observer 对象附加到 LiveData 对象。observe() 方法会采用 LifecycleOwner 对象。这样会使 Observer 对象订阅 LiveData 对象,以使其收到有关更改的通知。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中附加 Observer 对象。
1 | class NameViewModel : ViewModel() { |
1 | class NameActivity : AppCompatActivity() { |
更新LiveData数据, model.currentName.setValue()
或 model.currentName.postValue()
来更新 Name的值,Observer会被回调更新UI。
附加:Android KTX
【Android KTX】 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此,这些扩展程序利用了多种 Kotlin 语言功能,其中包括:
- 扩展函数
- 扩展属性
- Lambda
- 命名参数
- 参数默认值
- 协程
Fragment KTX
Fragment KTX 模块提供了一系列扩展程序以简化 Fragment API。
借助 Fragment KTX 模块,可以使用 lambda 来简化 Fragment 事务,例如:1
2
3
4
5
6
7fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}还可以使用 viewModels 和 activityViewModels 属性委托在一行中绑定到 ViewModel:
【省略,往上翻,上面有】
Lifecycle KTX
Lifecycle KTX 为每个 Lifecycle 对象定义一个 LifecycleScope。在此范围内启动的协程会在 Lifecycle 被销毁时取消。您可以使用 lifecycle.coroutineScope 或 lifecycleOwner.lifecycleScope 属性访问 Lifecycle 的 CoroutineScope。
1 | implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.1" |
以下示例演示了如何使用 lifecycleOwner.lifecycleScope 异步创建预计算文本:
1 | class MyFragment: Fragment() { |
ViewModel KTX
ViewModel KTX 库提供了一个 viewModelScope() 函数,可让您更轻松地从 ViewModel 启动协程。CoroutineScope 绑定至 Dispatchers.Main,并且会在清除 ViewModel 后自动取消。您可以使用 viewModelScope(),而无需为每个 ViewModel 创建一个新范围。
1 | lifecycle_version = "2.3.1" |
LiveData KTX
使用 LiveData 时,您可能需要异步计算值。例如,您可能需要检索用户的偏好设置并将其传送给界面。在这些情况下,LiveData KTX 可提供一个 liveData 构建器函数,该函数会调用 suspend 函数,并将结果作为 LiveData 对象传送。
1 | lifecycle_version = "2.3.1" |