前言

Android 应用程序开发中,Jetpack 是一个广受欢迎的开发工具包,它供给了许多组件和库,用于简化 Android 应用程序的开发过程。其中一个中心组件是 ViewModel,它用于办理应用程序的 UI 相关数据,并帮助处理装备更改时的生命周期问题。本文将全面介绍 Jetpack 中的 ViewModel 的运用方法和最佳实践。

什么是 ViewModel?

ViewModel 是 Jetpack 中的一个组件,它旨在存储和办理与 UI 相关的数据。ViewModel 的设计思维是将 UI 层与事务逻辑别离,使得数据在装备更改(例如屏幕旋转)时依然坚持可用。ViewModel 独立于 UI 层的生命周期,并在装备更改时保存其状况,因而能够轻松地处理生命周期感知的数据。

ViewModel 一般与 LiveData 结合运用,后者是一个可调查的数据容器。LiveData 使数据在 ViewModel 和 UI 之间进行双向绑定成为或许,从而使数据的更新能够自动反映在 UI 上。

如何运用 ViewModel?

要在应用程序中运用 ViewModel,首要需求在项目的 build.gradle 文件中增加 ViewModel 库的依靠:

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0"
}

接下来,在 Activity 或 Fragment 中创立 ViewModel 的实例。一般,最好将 ViewModel 与特定的 Activity 或 Fragment 关联起来,以便在装备更改时坚持一致。能够运用 by viewModels() 函数来完成这一点:

class MyActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModels()
    // ...
}

在上面的代码中,MyViewModel 是自定义的 ViewModel 类,by viewModels() 函数将为该 Activity 供给与之关联的 ViewModel 实例。类似地,在 Fragment 中,能够运用 by viewModels() 函数来创立关联的 ViewModel 实例。

在 ViewModel 类中,能够运用 LiveData 来存储和露出与 UI 相关的数据。经过将数据封装在 LiveData 中,能够保证数据的更新在装备更改时得到正确处理。下面是一个示例:

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> get() = _data
    // ...
}

在上面的代码中,_data 是一个私有的 MutableLiveData 目标,data 是对其的公开拜访。ViewModel 能够运用 _data.value 来更新数据,并经过 data 特点将数据露出给 UI 层。

最后,在 Activity 或 Fragment 中,能够调查 ViewModel 中的 LiveData 来更新 UI。一般,能够运用 observe() 函数来完成这一点:

viewModel.data.observe(this, { newData ->
    // 在此处更新 UI
})

在上面的代码中,this 表明当时的 Activity 或 Fragment,newData 是 ViewModel 中的数据更新时的参数。在调查者的回调中,能够依据新的数据更新 UI,以便及时反映 ViewModel 中的变化。

ViewModel 的生命周期

ViewModel 的生命周期与其关联的 Activity 或 Fragment 的生命周期不同。ViewModel 的生命周期能够跨过多个装备更改,而不受 Activity 或 Fragment 的毁掉和从头创立的影响。这意味着 ViewModel 能够在装备更改后继续保存其状况,而且不会丢失数据。

ViewModel 的生命周期能够总结为以下几个阶段:

  1. 创立阶段:ViewModel 在 Activity 或 Fragment 初次创立时被实例化。能够在 ViewModel 的构造函数中进行初始化工作。

  2. 活泼阶段:ViewModel 在其关联的 Activity 或 Fragment 处于活泼状况时坚持活泼。在这个阶段,能够调查 LiveData 或履行其他与 UI 相关的操作。

  3. 不活泼阶段:当 Activity 或 Fragment 进入非活泼状况(例如,另一个 Activity 坐落前台)时,ViewModel 会进入不活泼阶段。在这个阶段,能够暂停一些资源耗费较大的操作,以防止浪费资源。

  4. 整理阶段:当 Activity 或 Fragment 被毁掉时,ViewModel 将进入整理阶段。在这个阶段,能够开释资源、取消所有的调查者和整理任何不再需求的目标。

要了解 ViewModel 的当时生命周期状况,能够运用 ViewModel 的 onCleared() 方法来检测 ViewModel 是否已被整理。

最佳实践和注意事项

以下是运用 ViewModel 时的一些最佳实践和注意事项:

  1. 将 ViewModel 与 UI 层逻辑别离:ViewModel 应该专心于办理数据和事务逻辑,而不该包括与 UI 层直接相关的代码。将 UI 逻辑放在 Activity 或 Fragment 中,以便完成杰出的别离和可测试性。

  2. 防止将 Activity 或 Fragment 作为参数传递给 ViewModel:ViewModel 应该是与特定 UI 组件无关的,因而防止将 Activity 或 Fragment 作为参数传递给 ViewModel。假如需求在 ViewModel 中履行某些操作(例如,导航到另一个屏幕),能够运用回调接口或 LiveData 来通知 UI 层。

  3. 运用 Lifecycle-Aware 组件:ViewModel 一般与 Lifecycle-Aware 组件(如 LiveData 和 LifecycleObserver)一同运用,以便更好地办理生命周期。这些组件能够自动感知生命周期变化,并在适当的时机处理数据的更新和资源的开释。

  4. 防止在 ViewModel 中持有对 Context 的引证:因为 ViewModel 的生命周期或许超出 Activity 或 Fragment 的生命周期,因而防止在 ViewModel 中持有对 Context 的引证,以防止内存走漏。假如需求运用 Context,能够运用 Application Context 或传递特定的上下文参数。

  5. 单一职责原则:每个 ViewModel 应该专心于办理特定 UI 组件或屏幕的数据。防止将过多的责任放在单个 ViewModel 中,以坚持代码的清晰性和可维护性。

  6. 运用 ViewModelFactory 进行依靠注入:假如 ViewModel 需求依靠其他目标或参数进行初始化,主张运用 ViewModelFactory 来创立 ViewModel 实例,并将所需的依靠项传递给 ViewModel。这样能够更好地进行依靠注入,并保证 ViewModel 的可测试性。

  7. 防止在 ViewModel 中进行耗时操作:ViewModel 应该专心于数据办理,而不该履行耗时的操作。假如需求履行耗时操作,例如从网络加载数据或进行数据库拜访,主张将这些操作委托给其他组件(如 Repository)来处理。

  8. 运用适当的效果域办理 ViewModel:依据需求,能够运用不同的效果域来办理 ViewModel 的生命周期。例如,能够运用 Activity 作为 ViewModel 的效果域,以保证 ViewModel 与特定的 Activity 相关联,并在 Activity 被毁掉时进行整理。

总结

Jetpack 中的 ViewModel 是一个强大的组件,可帮助简化 Android 应用程序的开发过程并解决装备更改时的生命周期问题。运用 ViewModel 能够完成 UI 与数据的别离,使得数据在装备更改后依然可用,而且能够经过 LiveData 完成数据的双向绑定。

在运用 ViewModel 时,主张遵从最佳实践和注意事项,例如将 ViewModel 与 UI 逻辑别离、防止持有对 Context 的引证、运用 Lifecycle-Aware 组件等。经过正确运用 ViewModel,能够提高应用程序的可维护性、可测试性,并供给更好的用户体验。