为什么需要 ViewModel?
传统开发中,当屏幕旋转时,Activity 会被销毁并重新创建,其中的临时数据(如网络请求结果、用户输入内容)会丢失。
ViewModel 的生命周期与 Activity/Fragment 的配置变化无关,它会在整个界面生命周期内保持存在,直到界面彻底销毁(如用户关闭页面)。
ViewModel 基本用法
1. 添加依赖
在 build.gradle
(Module 级别)中添加依赖(确保使用最新版本)
dependencies {
// ViewModel + LiveData(通常一起使用)
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
// 如果你用 Kotlin 协程
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2"
}
2. 定义 ViewModel 类
创建一个继承 ViewModel
的类,在其中存放需要保留的数据和业务逻辑:
Kotlin
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// 示例:存储计数器数据
private var count = 0
// 获取当前计数
fun getCount(): Int = count
// 增加计数
fun incrementCount() {
count++
}
// 清除计数
fun resetCount() {
count = 0
}
// ViewModel 销毁时调用(如页面关闭)
override fun onCleared() {
super.onCleared()
// 释放资源,如取消网络请求、关闭数据库连接等
}
}
3. 在 Activity/Fragment 中使用 ViewModel
通过 ViewModelProvider
获取 ViewModel 实例(不要自己 new 实例,否则无法保证生命周期):
Kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 获取 ViewModel 实例(配置变化时会复用同一个实例)
viewModel = ViewModelProvider(this)[MyViewModel::class.java]
// 绑定 UI 控件
val textView = findViewById<TextView>(R.id.textView)
val incrementBtn = findViewById<Button>(R.id.incrementBtn)
val resetBtn = findViewById<Button>(R.id.resetBtn)
// 初始化显示
updateCountText(textView)
// 按钮点击事件
incrementBtn.setOnClickListener {
viewModel.incrementCount()
updateCountText(textView)
}
resetBtn.setOnClickListener {
viewModel.resetCount()
updateCountText(textView)
}
}
private fun updateCountText(textView: TextView) {
textView.text = "当前计数:${viewModel.getCount()}"
}
}