Android-Kotlin基础(Jetpack①-ViewModel)

为什么需要 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()}"
    }
}
相关推荐
.Bryce.34 分钟前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
方舟小孩2 小时前
开源办公软件海豹办公 1.9.15 实战 从模板异常到 Android WebView 资源回归
android
用户2181697049302 小时前
Kotlin 语法四 协程
android
出师牛2 小时前
Android - 再探Handler
android
高晶2 小时前
Android 物联网组网实战:NFC 从零到落地
android·java
stevenzqzq2 小时前
android 维度和渠道
android
古法安卓2 小时前
Android-SystemUI ANR协程相关问题排查
android·java·android studio
xiaogai_gai3 小时前
生产汇报单查询同步实战:从金蝶云星空拉取到轻易云数据集成平台的工程化做法
android
释厄6234 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
wno7044 小时前
MYSQL 常用合并函数
android·数据库·mysql