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()}"
    }
}
相关推荐
谢白羽26 分钟前
vllm实践
android·vllm
电子云与长程纠缠1 小时前
Godot学习03 - 实例化、层级访问、Export
android·学习·godot
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于Android的便民系统的设计与实现为例,包含答辩的问题和答案
android
鬼蛟2 小时前
Spring————事务
android·java·spring
qq_170264753 小时前
unity出安卓年龄分级的arr包问题
android·unity·游戏引擎
kejiashao5 小时前
Android View的绘制流程及事件分发机制
android
小蜜蜂嗡嗡5 小时前
flutter实现付费解锁内容的遮挡
android·flutter
进击的cc5 小时前
拒绝背诵!一文带你打穿 Android ANR 发生的底层全链路
android·面试
进击的cc5 小时前
App 启动优化全家桶:别再只盯着 Application 了,热启动优化你真的做对了吗?
android·面试
彭波3966 小时前
安卓手机端安装xapk、apkm软件!怎样安装xapk软件?安卓的apk和XAPK的区别?附教程
android·智能手机