返回
ViewModel:视图数据的守护神
Android
2023-09-30 02:14:01
Jetpack AAC 完全解析(三):掌握 ViewModel,操控视图数据如臂使指
引言:
Jetpack AAC 组件,一个为 Android 应用开发注入活力的工具集,持续惊艳着开发界。其强大的数据处理组件 LiveData,为数据的更新感知带来了革命性的体验。今天,让我们深入剖析另一位搭档——ViewModel,它将带领我们掌控视图数据,踏上随心所欲之旅。
ViewModel 是 Jetpack AAC 中一个轻量级、生命周期感知的组件。它的职责在于桥接视图和数据模型,确保视图数据在配置更改或屏幕旋转等场景中依然稳如泰山。
关键特性:
- 生命周期感知: 与视图绑定,在视图销毁时自动销毁,避免内存泄露。
- 数据持久性: 无论视图状态如何变化,ViewModel 中的数据始终保持存续。
- 跨视图共享: 可在不同视图之间共享数据,实现数据同步。
ViewModel 的核心功能之一是与 LiveData 的协作。LiveData 作为数据观察者,ViewModel 则充当数据提供者。这种组合确保了数据更新时,观察者能及时获知,并在活跃生命周期内做出响应。
创建 ViewModel 的方法很简单,只需继承 ViewModel 类并重写所需方法即可。在 Fragment 或 Activity 中,使用 ViewModelProviders 类获取或创建 ViewModel 实例。
// 创建 ViewModel 实例
val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
// 绑定 ViewModel 到视图
lifecycle.addObserver(viewModel)
- 只保存视图相关数据: ViewModel 应仅存储与视图显示相关的必要数据,避免过度膨胀。
- 合理利用 LiveData: LiveData 是轻量级的观察者模式,应尽可能使用它来监听数据变化。
- 解绑 ViewModel: 当视图不再需要 ViewModel 时,应及时解绑,释放资源。
- 避免使用单例: 除非有特殊需求,一般不建议使用单例 ViewModel,因为这可能导致内存泄露。
让我们以航班预订应用程序为例,来说明 ViewModel 的实际应用。
class FlightBookingViewModel : ViewModel() {
private val _departureAirport = MutableLiveData<String>()
private val _arrivalAirport = MutableLiveData<String>()
val departureAirport: LiveData<String> get() = _departureAirport
val arrivalAirport: LiveData<String> get() = _arrivalAirport
fun setDepartureAirport(airport: String) {
_departureAirport.postValue(airport)
}
fun setArrivalAirport(airport: String) {
_arrivalAirport.postValue(airport)
}
}
在 Fragment 中:
// 创建 ViewModel 实例
val viewModel = ViewModelProviders.of(this).get(FlightBookingViewModel::class.java)
// 监听数据变化
viewModel.departureAirport.observe(this, Observer { airport ->
// 更新 UI
})
通过 ViewModel,Jetpack AAC 为我们提供了操控视图数据的强大工具。它与 LiveData 的无缝协作,确保了数据更新的实时感知,为应用程序带来稳定、高效的数据管理体验。合理使用 ViewModel,将助你轻松驾驭视图数据,打造出更加健壮、灵活的 Android 应用。