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()}"
    }
}
相关推荐
豆豆豆大王4 小时前
Android 数据持久化(SharedPreferences)
android
Paper_Love4 小时前
RK3588-android-reboot命令内核调用流程
android
介一安全4 小时前
【Frida Android】基础篇12:Native层hook基础——调用原生函数
android·网络安全·逆向·安全性测试·frida·1024程序员节
2501_916008895 小时前
用多工具组合把 iOS 混淆做成可复用的工程能力(iOS混淆|IPA加固|无源码混淆|Ipa Guard|Swift Shield)
android·开发语言·ios·小程序·uni-app·iphone·swift
Zach_yuan5 小时前
程序地址空间
android·linux·运维·服务器
带电的小王6 小时前
llama.cpp:Android端测试Qwen2.5-Omni
android·llama.cpp·qwen2.5-omni
明道源码6 小时前
Android Studio 代码编辑区域的使用
android·ide·android studio
小墙程序员8 小时前
从隐私协议了解Android App到底获取了哪些信息
android
小墙程序员8 小时前
Android 5 到 16 期间 service 的发展
android
Android小码家8 小时前
Android8.0+Camera2编译&烧录&源码研习
android·framework