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()}"
    }
}
相关推荐
xiaolizi5674891 小时前
安卓远程安卓(通过frp与adb远程)完全免费
android·远程工作
阿杰100012 小时前
ADB(Android Debug Bridge)是 Android SDK 核心调试工具,通过电脑与 Android 设备(手机、平板、嵌入式设备等)建立通信,对设备进行控制、文件传输、命令等操作。
android·adb
梨落秋霜2 小时前
Python入门篇【文件处理】
android·java·python
遥不可及zzz4 小时前
Android 接入UMP
android
Coder_Boy_6 小时前
基于SpringAI的在线考试系统设计总案-知识点管理模块详细设计
android·java·javascript
冬奇Lab7 小时前
【Kotlin系列03】控制流与函数:从if表达式到Lambda的进化之路
android·kotlin·编程语言
冬奇Lab7 小时前
稳定性性能系列之十二——Android渲染性能深度优化:SurfaceFlinger与GPU
android·性能优化·debug
冬奇Lab8 小时前
稳定性性能系列之十一——Android内存优化与OOM问题深度解决
android·性能优化
用户74589002079549 小时前
线程池
android