Kotlin: Jetpack — ViewModel简单应用

ViewModel 概览 Android Jetpack 的一部分。

ViewModel 类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面,以及封装相关的业务逻辑。 它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在 activity 之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。

1.导包:

Kotlin 复制代码
    //viewModel包
    // https://mvnrepository.com/artifact/androidx.lifecycle/lifecycle-viewmodel-ktx
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'


    //runtimeOnly 用于声明一个只在运行时需要的依赖。这意味着这个依赖在编译时不需要,但在运行时需要。
    // 设为runtimeOnly 在编译时会提示有些包找不到比如 viewModels 提示没有  解决方法改为 implementation
    //implementation  依赖项作为编译和运行时的依赖。这意味着这个依赖在编译和运行时都是可见的。
    //工具类实现viewModel创建简化开发 2个包
    // https://mvnrepository.com/artifact/androidx.fragment/fragment-ktx
    implementation  'androidx.fragment:fragment-ktx:1.6.1'
    // https://mvnrepository.com/artifact/androidx.activity/activity-ktx
    implementation  'androidx.activity:activity-ktx:1.6.1'

2.ViewModel() 的创建

写个类实现 ViewModel()

Kotlin 复制代码
package com.example

import android.app.Application
import android.util.Log
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.ViewModel

/**
 * ViewModel() 的创建
 * AndroidViewModel() 子类
 */
class MyviewModel : ViewModel() {
    //初始化块
    init {
        Log.i("TAG", ": MyviewModel ViewModel 初始化")
    }

    //internal  只能在同一个模块或库中被访问,而不能在其他模块或库中被访问。
    internal fun getName(): String {
        return "---MyviewModel getName()方法-${System.currentTimeMillis()}"
    }

    //重新销毁方法
    override fun onCleared() {
        super.onCleared()
        Log.i("TAG", ": MyviewModel onCleared 销毁方法")
    }
}

//AndroidViewModel(private val application: Application) : ViewModel()
class MyviewModelTwo(application: Application) : AndroidViewModel(application) {
    //初始化块
    init {
        Log.i("TAG", ": MyviewModelTwo AndroidViewModel 初始化")
    }

    fun getName(): String {

        return "---MyviewModelTwo getName()方法-${System.currentTimeMillis()}"
    }

    //重新销毁方法
    override fun onCleared() {
        super.onCleared()
        Log.i("TAG", ": MyviewModelTwo onCleared 销毁方法")
    }


}

3.ViewModel 的3种使用方法

MainActivity

Kotlin 复制代码
package com.example

import android.os.Bundle
import android.util.Log
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelLazy
import androidx.lifecycle.ViewModelProvider



class MainActivity : AppCompatActivity() {
    //viewmodel使用1.代理 by ViewModelLazy 返回Lazy<VM>
    val vm1: MyviewModel by ViewModelLazy<MyviewModel>(
        MyviewModel::class,
        { viewModelStore },
        { defaultViewModelProviderFactory })

    //2.使用工具类导包方法简化写法 实现原理和上面一样
    //    implementation  'androidx.fragment:fragment-ktx:1.6.1'
    //    implementation  'androidx.activity:activity-ktx:1.6.1'
    val vm2: MyviewModel by viewModels<MyviewModel> { defaultViewModelProviderFactory }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.i("TAG", "---创建--onCreate")
        setContentView(R.layout.activity_main)

        //3.ViewModelProvider
        val vm3: MyviewModel = ViewModelProvider(
            viewModelStore,//这个对象只有在Activity创建之和才会有
            defaultViewModelProviderFactory
        ).get(MyviewModel::class.java)

        //4 java 中方法  implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'
//         myViewModle = ViewModelProviders.of(this).get(MyViewModle.class);

 //val mviewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(this.application))[MyviewModelTwo::class.java]
       // mviewModel.getName()

        //输出结果
        Log.i("MainActivity", "vm1.getName ${vm1.getName()}")
        Log.i("MainActivity", "vm2.getName ${vm2.getName()}")
        Log.i("MainActivity", "vm3.getName ${vm3.getName()}")
    }

    override fun onStart() {
        super.onStart()
        Log.i("TAG", "---开始--onStart")
    }

    override fun onResume() {
        super.onResume()
        Log.i("TAG", "---运行--onResume")
    }

    override fun onPause() {
        super.onPause()
        Log.i("TAG", "---暂停--onPause")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i("TAG", "---销毁--onDestroy")
    }

    override fun onStop() {
        super.onStop()
        Log.i("TAG", "---停止--onStop")
    }

    override fun onRestart() {
        super.onRestart()
        Log.i("TAG", "---重新启动--onRestart")
    }


}

Log 日志:

Kotlin 复制代码
打开启动: 
 ---创建--onCreate
: MyviewModel ViewModel 初始化
vm1.getName ---MyviewModel getName()方法-1704437476931
vm2.getName ---MyviewModel getName()方法-1704437476931
vm3.getName ---MyviewModel getName()方法-1704437476931
---开始--onStart
---运行--onResume


home 键退出:
---暂停--onPause
---停止--onStop


重新打开:
---重新启动--onRestart
---开始--onStart
 ---运行--onResume


退出应用:
---暂停--onPause
---停止--onStop
: MyviewModel onCleared 销毁方法
---销毁--onDestroy
相关推荐
future_li几秒前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
佛系豪豪吖7 分钟前
AtomCode 部署流程与使用经验
笔记·chatgpt·github·ai编程·gitcode
逐光老顽童9 分钟前
用 Jetpack Compose + MVI 开发了一个 Authenticator 双因素认证应用
架构·kotlin
杊页11 分钟前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at12 分钟前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
故渊at33 分钟前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
故渊at37 分钟前
第十三板块:Android 综合架构与未来演进 | 第三十二篇:Android 内存管理与 LMK 机制的深度剖析
android·架构·内存管理·内存回收·lmk机制·收割算法
故渊at38 分钟前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
jushi899938 分钟前
FB Neo 街机模拟器全游戏整合版 含25000+街机游戏怀旧复古街机游戏 解压即玩 热门怀旧街机游戏全集安卓+PC电脑版
android·游戏·电脑
vensli40 分钟前
体验专题——Android 应用瘦身实战
android·网络