ViewModel 和 LiveData 是 Android 架构组件中的两个核心类,用于帮助开发者构建健壮、可维护且响应迅速的应用程序。它们通常一起使用,以实现数据与 UI 的分离,并确保数据在配置更改(如屏幕旋转)时不会丢失。
1.1 ViewModel 的使用步骤
添加依赖:
在 build.gradle 文件中添加 ViewModel 的依赖:
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
创建 ViewModel 类:
创建一个继承自 ViewModel 的类,并在其中定义与 UI 相关的数据和方法。
class MyViewModel : ViewModel() {
// 定义 LiveData 或其他数据
private val _data = MutableLiveData()
val data: LiveData get() = _data
fun loadData() {
// 模拟数据加载
_data.value = "Hello, ViewModel!"
}
}
在 Activity 或 Fragment 中使用 ViewModel:
使用 ViewModelProvider 获取 ViewModel 的实例,并观察 LiveData 数据。
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 获取 ViewModel 实例
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
// 观察 LiveData
viewModel.data.observe(this, Observer { data ->
// 更新 UI
textView.text = data
})
// 触发数据加载
viewModel.loadData()
}
}
1.2 ViewModel 的生命周期
ViewModel 的生命周期比 Activity 或 Fragment 更长。它在 Activity 或 Fragment 被销毁并重新创建时仍然存在,直到 Activity 或 Fragment 完全销毁(即 finish() 被调用或用户按下返回键)。
2. LiveData
LiveData 是一种可观察的数据持有者,它允许 UI 组件观察数据的变化,并在数据发生变化时自动更新 UI。LiveData 是生命周期感知的,意味着它只会在 Activity 或 Fragment 处于活跃状态时更新 UI。
2.1 LiveData 的使用步骤
定义 LiveData:
在 ViewModel 中定义 LiveData,通常使用 MutableLiveData 作为可变的 LiveData。
class MyViewModel : ViewModel() {
private val _data = MutableLiveData()
val data: LiveData get() = _data
fun updateData(newData: String) {
_data.value = newData
}
}
观察 LiveData:
在 Activity 或 Fragment 中观察 LiveData,并在数据变化时更新 UI
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
// 观察 LiveData
viewModel.data.observe(this, Observer { data ->
textView.text = data
})
// 更新数据
viewModel.updateData("New Data")
}
}
2.2 LiveData 的生命周期感知
LiveData 是生命周期感知的,这意味着它只会通知处于活跃生命周期状态(如 STARTED 或 RESUMED)的观察者。如果观察者的生命周期处于 DESTROYED 状态,LiveData 会自动移除观察者,避免内存泄漏。
3. ViewModel 和 LiveData 的结合使用
ViewModel 和 LiveData 通常一起使用,以实现数据与 UI 的分离。ViewModel 负责管理数据,而 LiveData 负责将数据的变化通知给 UI。
3.1 示例:计数器应用
class CounterViewModel : ViewModel() {
private val _count = MutableLiveData()
val count: LiveData get() = _count
init {
_count.value = 0
}
fun increment() {
_count.value = (_count.value ?: 0) + 1
}
}
class CounterActivity : AppCompatActivity() {
private lateinit var viewModel: CounterViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_counter)
viewModel = ViewModelProvider(this).get(CounterViewModel::class.java)
viewModel.count.observe(this, Observer { count ->
counterTextView.text = count.toString()
})
incrementButton.setOnClickListener {
viewModel.increment()
}
}
}
在这个例子中,CounterViewModel 管理计数器的状态,并通过 LiveData 将计数器的值暴露给 UI。CounterActivity 观察 LiveData 并在数据变化时更新 UI。
4. 总结
ViewModel:用于管理与 UI 相关的数据,并在配置更改时保持数据的持久性。
LiveData:用于观察数据的变化,并在数据变化时自动更新 UI。它是生命周期感知的,避免内存泄漏。
通过结合使用 ViewModel 和 LiveData,开发者可以构建出更加健壮、可维护且响应迅速的 Android 应用程序。