前言
在 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 的生命周期能够总结为以下几个阶段:
-
创立阶段:ViewModel 在 Activity 或 Fragment 初次创立时被实例化。能够在 ViewModel 的构造函数中进行初始化工作。
-
活泼阶段:ViewModel 在其关联的 Activity 或 Fragment 处于活泼状况时坚持活泼。在这个阶段,能够调查 LiveData 或履行其他与 UI 相关的操作。
-
不活泼阶段:当 Activity 或 Fragment 进入非活泼状况(例如,另一个 Activity 坐落前台)时,ViewModel 会进入不活泼阶段。在这个阶段,能够暂停一些资源耗费较大的操作,以防止浪费资源。
-
整理阶段:当 Activity 或 Fragment 被毁掉时,ViewModel 将进入整理阶段。在这个阶段,能够开释资源、取消所有的调查者和整理任何不再需求的目标。
要了解 ViewModel 的当时生命周期状况,能够运用 ViewModel 的 onCleared()
方法来检测 ViewModel 是否已被整理。
最佳实践和注意事项
以下是运用 ViewModel 时的一些最佳实践和注意事项:
-
将 ViewModel 与 UI 层逻辑别离:ViewModel 应该专心于办理数据和事务逻辑,而不该包括与 UI 层直接相关的代码。将 UI 逻辑放在 Activity 或 Fragment 中,以便完成杰出的别离和可测试性。
-
防止将 Activity 或 Fragment 作为参数传递给 ViewModel:ViewModel 应该是与特定 UI 组件无关的,因而防止将 Activity 或 Fragment 作为参数传递给 ViewModel。假如需求在 ViewModel 中履行某些操作(例如,导航到另一个屏幕),能够运用回调接口或 LiveData 来通知 UI 层。
-
运用 Lifecycle-Aware 组件:ViewModel 一般与 Lifecycle-Aware 组件(如 LiveData 和 LifecycleObserver)一同运用,以便更好地办理生命周期。这些组件能够自动感知生命周期变化,并在适当的时机处理数据的更新和资源的开释。
-
防止在 ViewModel 中持有对 Context 的引证:因为 ViewModel 的生命周期或许超出 Activity 或 Fragment 的生命周期,因而防止在 ViewModel 中持有对 Context 的引证,以防止内存走漏。假如需求运用 Context,能够运用 Application Context 或传递特定的上下文参数。
-
单一职责原则:每个 ViewModel 应该专心于办理特定 UI 组件或屏幕的数据。防止将过多的责任放在单个 ViewModel 中,以坚持代码的清晰性和可维护性。
-
运用 ViewModelFactory 进行依靠注入:假如 ViewModel 需求依靠其他目标或参数进行初始化,主张运用 ViewModelFactory 来创立 ViewModel 实例,并将所需的依靠项传递给 ViewModel。这样能够更好地进行依靠注入,并保证 ViewModel 的可测试性。
-
防止在 ViewModel 中进行耗时操作:ViewModel 应该专心于数据办理,而不该履行耗时的操作。假如需求履行耗时操作,例如从网络加载数据或进行数据库拜访,主张将这些操作委托给其他组件(如 Repository)来处理。
-
运用适当的效果域办理 ViewModel:依据需求,能够运用不同的效果域来办理 ViewModel 的生命周期。例如,能够运用 Activity 作为 ViewModel 的效果域,以保证 ViewModel 与特定的 Activity 相关联,并在 Activity 被毁掉时进行整理。
总结
Jetpack 中的 ViewModel 是一个强大的组件,可帮助简化 Android 应用程序的开发过程并解决装备更改时的生命周期问题。运用 ViewModel 能够完成 UI 与数据的别离,使得数据在装备更改后依然可用,而且能够经过 LiveData 完成数据的双向绑定。
在运用 ViewModel 时,主张遵从最佳实践和注意事项,例如将 ViewModel 与 UI 逻辑别离、防止持有对 Context 的引证、运用 Lifecycle-Aware 组件等。经过正确运用 ViewModel,能够提高应用程序的可维护性、可测试性,并供给更好的用户体验。