咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

Android Jetpack架构组件

【Android Jetpack 使用入门】
【Android 架构组件 Android Jetpack 的一部分。】

Android 架构组件是一组库,可帮助您设计稳健、可测试且易维护的应用。您可以从管理界面组件生命周期和处理数据持久性的类着手。

  • 通过应用架构指南,学习有关汇编稳健应用的基础知识。
  • 管理应用的生命周期。新的生命周期感知型组件可帮助您管理 Activity 和 Fragment 的生命周期。在配置更改后继续有效、避免内存泄漏,以及将数据轻松加载到界面中。
  • 使用 LiveData 构建数据对象,在基础数据库改变时通知视图。
  • ViewModel 存储界面相关的数据,这些数据不会在应用旋转时销毁。
  • Room 是一个 SQLite 对象映射库。它可用来避免样板代码,还可以轻松地将 SQLite 表数据转换为 Java 对象。Room 提供 SQLite 语句的编译时检查,并且可以返回 RxJava、Flowable 和 LiveData 可观察对象。

** Jetpack有很多部分,这里先整理一下最常用的两个:ViewModelLiveData **

一、ViewModel

【ViewModel 概览】

ViewModel 以注重生命周期的方式存储和管理界面相关的数据,比如让数据可在屏幕旋转等配置更改后继续留存。
类似在 onSaveInstanceState() 处理数据的保存和恢复。

1
2
3
4
5
import androidx.lifecycle.ViewModel

class TestViewModel : ViewModel() {
var num = 0
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private lateinit var myViewModel: MyViewModel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

myViewModel = ViewModelProvider(this).get(MyViewModel::class.java)

}

fun test(){

//直接赋值或者取值
myViewModel.num++
}

这样 num 变量就能在屏幕旋转时自动保存和恢复,单独使用ViewModel感觉没多大优势,如何配合LiveData将更加方便。

** Fragment KTX **

引入fragment-ktx这个扩展库:

1
implementation "androidx.fragment:fragment-ktx:1.3.3"

可以更加简洁的创建ViewModel

1
2
3
4
5
6
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()

// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()

二、LiveData

【LiveData 概览】

LiveData 具有生命周期感知能力观察类,遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

使用 LiveData 的优势:

  • 确保界面符合数据状态
  • 不会发生内存泄漏
  • 不会因 Activity 停止而导致崩溃
  • 不再需要手动处理生命周期
  • 数据始终保持最新状态
  • 适当的配置更改
  • 共享资源

请按照以下步骤使用 LiveData 对象:

  1. 创建 LiveData 的实例以存储某种类型的数据。这通常在 ViewModel 类中完成。
  2. 创建可定义 onChanged() 方法的 Observer 对象,该方法可以控制当 LiveData 对象存储的数据更改时会发生什么。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中创建 Observer 对象。
  3. 使用 observe() 方法将 Observer 对象附加到 LiveData 对象。observe() 方法会采用 LifecycleOwner 对象。这样会使 Observer 对象订阅 LiveData 对象,以使其收到有关更改的通知。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中附加 Observer 对象。
1
2
3
4
5
6
7
8
9
10
class NameViewModel : ViewModel() {

// Create a LiveData with a String
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}

// Rest of the ViewModel...
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class NameActivity : AppCompatActivity() {

private val model: NameViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// 新建观察者实例,用于更新UI
val nameObserver = Observer<String> { newName ->

nameTextView.text = newName
}

// 观察 LiveData
model.currentName.observe(this, nameObserver)
}
}

更新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

  1. Fragment KTX 模块提供了一系列扩展程序以简化 Fragment API。
    借助 Fragment KTX 模块,可以使用 lambda 来简化 Fragment 事务,例如:

    1
    2
    3
    4
    5
    6
    7
    fragmentManager().commit {
    addToBackStack("...")
    setCustomAnimations(
    R.anim.enter_anim,
    R.anim.exit_anim)
    add(fragment, "...")
    }
  2. 还可以使用 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
2
3
4
5
6
7
8
9
10
11
12
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}

ViewModel KTX

ViewModel KTX 库提供了一个 viewModelScope() 函数,可让您更轻松地从 ViewModel 启动协程。CoroutineScope 绑定至 Dispatchers.Main,并且会在清除 ViewModel 后自动取消。您可以使用 viewModelScope(),而无需为每个 ViewModel 创建一个新范围。

1
2
3
lifecycle_version = "2.3.1"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"

LiveData KTX

使用 LiveData 时,您可能需要异步计算值。例如,您可能需要检索用户的偏好设置并将其传送给界面。在这些情况下,LiveData KTX 可提供一个 liveData 构建器函数,该函数会调用 suspend 函数,并将结果作为 LiveData 对象传送。

1
2
3
lifecycle_version = "2.3.1"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"