Kotlin: Jetpack — ViewModel简单应用

ViewModel 概览   Android Jetpack 的一部分。

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

1.导包:

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

2.ViewModel() 的创建 

写个类实现 ViewModel()

package com.exampleimport 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

package com.exampleimport android.os.Bundle
import android.util.Log
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelLazy
import androidx.lifecycle.ViewModelProviderclass 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.ViewModelProviderval 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 日志:

打开启动: ---创建--onCreate
: MyviewModel ViewModel 初始化
vm1.getName ---MyviewModel getName()方法-1704437476931
vm2.getName ---MyviewModel getName()方法-1704437476931
vm3.getName ---MyviewModel getName()方法-1704437476931
---开始--onStart
---运行--onResumehome 键退出:
---暂停--onPause
---停止--onStop重新打开:
---重新启动--onRestart
---开始--onStart---运行--onResume退出应用:
---暂停--onPause
---停止--onStop
: MyviewModel onCleared 销毁方法
---销毁--onDestroy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio ViewPager2应用设计

一、ViewPager2应用场景: ViewPager2是一个功能强大的滑动容器,提供灵活的页面切换和布局定制功能,使得应用程序界面更加丰富和交互性强,主要应用于以下场景: 1)、实现引导页或欢迎页:ViewPager2可用于创建引导页/欢迎页,让用户通过滑动浏览介绍应用程序功能/展示欢迎…

SpringBoot学习(五)-Spring Security配置与应用

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! Spring Security Spring Security是一个基于Java的开源框架&#xff0c;用于在Java应用程…

【深度学习】cv领域中各种loss损失介绍

文章目录 前言一、均方误差二、交叉熵损失三、二元交叉熵损失四、Smooth L1 Loss五、IOU系列的loss 前言 损失函数是度量模型的预测输出与真实标签之间的差异或误差&#xff0c;在深度学习算法中起着重要作用。具体作用&#xff1a; 1、目标优化&#xff1a;损失函数是优化算法…

Leetcode2807. 在链表中插入最大公约数

Problem: 2807. 在链表中插入最大公约数 文章目录 题目思路注意点Code 题目思路 模拟插入流程&#xff1a; 检测当前节点是否有后置结点&#xff1b;将当前结点与后置结点的值做最大公约数处理得到新结点的值&#xff0c;然后插入到当前结点之后&#xff1b;再将检测结点向后…

文件归类妙招:用关键字替换改扩展名方法,文件重命名技巧

在日常工作中&#xff0c;文件的数量会随着时间的推移不断增加。如果文件没有得到适当的归类和整理&#xff0c;就会导致很难找到所需的文件。所以文件归类是非常重要的任务。现在来看云炫文件管理器一些实用的文件归类妙招&#xff1a;用关键字替换修改文件扩展名的方法&#…

Kubernetes复习总结(二):Kubernetes容器网络

2、Kubernetes容器网络 1&#xff09;、Docker网络原理 Docker默认使用的网络模型是bridge&#xff0c;这里只讲bridge网络模型 1&#xff09;容器之间通信原理 当安装完docker之后&#xff0c;docker会在宿主机上创建一个名叫docker0的网桥&#xff0c;默认IP是172.17.0.1…

[Verilog语言入门教程] 乘法器(顺序 Booth 并行 Wallace) 原理与实现

依公知及经验整理,原创保护,禁止转载。 专栏 《Verilog》 <<<< 返回总目录 <<<< 乘法器可以分为以下几种类型: 顺序乘法器(Sequential Multiplier):顺序乘法器是最简单的乘法器类型,采用逐位相乘的方法实现。这种乘法器适用于小规模的乘法运算…

pytest常用的第三方插件介绍

本节介绍了如何安装和使用第三方插件。如果你想要编写自己的插件&#xff0c;请参阅“编写插件”。 通过pip可以轻松安装第三方插件&#xff1a; pip install pytest-NAME pip uninstall pytest-NAME如果已经安装了插件&#xff0c;pytest会自动找到并集成它&#xff0c;无需手…

AI动作冒险电影《加勒比海盗:失落的宝藏》(下)

AI动作冒险电影《加勒比海盗&#xff1a;失落的宝藏》&#xff08;下&#xff09; 在宝藏岛屿的探险中&#xff0c;杰克船长不断遭遇铁钩胡克的追击&#xff0c;并陷入了一系列生死危机中。然而&#xff0c;当杰克终于找到宝藏所在的洞穴时&#xff0c;却发现了一个令人震惊的事…

HarmonyOS 开发基础(五)Button

HarmonyOS 开发基础&#xff08;五&#xff09;Button Entry Component struct Index {build() {Row() {Column() {// Button&#xff1a;ArkUI 的基础组件 按钮组件// label 参数&#xff1a;文字型按钮Button(我是按钮)// width&#xff1a;属性方法&#xff0c;设置组件的宽…

shell编程-分支语句和循环结构

流控制: •在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。 •流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令 •exit语句:退出程序的执行&#xff0c;并返回一个返回码&#xff0c;返回码为0正常退出&#…

Opencv实时获取摄像头数据(附带解析)

# 注意这段代码不能直接在jupyter中使用,否则会崩溃 import cv2 # 引入CV库 """ 读取摄像头数据&#xff0c;实时获取摄像头数据&#xff0c;同时按q退出 """ # 创建窗口 cv2.namedWindow(video, cv2.WINDOW_NORMAL) cv2.resizeWindow(video, 3…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop中处理被激活的文件描述符的事件

文件描述符处理与回调函数 一、主要概念 反应堆模型&#xff1a;一种处理系统事件或网络事件的模型&#xff0c;当文件描述符被激活时&#xff0c;可以检测到文件描述符&#xff1a;在操作系统中&#xff0c;用于标识打开的文件、套接字等的一种数据类型 处理激活的文件描述符…

BUUCTF--pwnable_start1

查看保护&#xff1a; 32位程序保护全没开&#xff0c;黑盒测试下效果&#xff1a; 存在栈溢出&#xff0c;那么这题的想法就是直接ret2shellcode了。IDA中看看具体流程&#xff1a; 出奇的少&#xff0c;这题不能看反汇编的代码&#xff0c;直接去看汇编&#xff1a; 主要就2个…

【设计模式之美】面向对象分析方法论与实现(一):需求分析方法论

文章目录 一. 需求举例二. 对案例进行需求分析1. 第一轮基础分析2. 第二轮分析优化3. 第三轮分析优化4. 第四轮分析优化5. 最终确定需求 三. 小结 本文主要描述&#xff1a; 面向对象的需求分析方法论 一. 需求举例 假设&#xff0c;你正在参与开发一个微服务。微服务通过 HTT…

数据结构-怀化学院期末题(490)

哈希查找 题目描述&#xff1a; 实现哈希查找。要求根据给定的哈希函数进行存储&#xff0c;并查找相应元素的存储位置。本题目使用的哈希函数为除留取余法&#xff0c;即H(key)key%m&#xff0c;其中m为存储空间&#xff0c;冲突处理方法采用开放定址法中的线性探测再散列&am…

(C语言)指针的进阶

1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2.指针的大小是固定的4/8个字节(32位平台/64位平台)。 3.指针是有类型&#xff0c;指针的类型决定了指针的-整数的步长&#xff0c;指针解引用操作的时候的权限。 4.指针的运算。 一、关于两…

msvcr120.dll丢失怎样修复,三种修复msvcr120.dll丢失的方法

"msvcr120.dll"是一个重要的库文件&#xff0c;用于支持Microsoft Visual C 2013 Redistributable软件包中的应用程序。在本文中&#xff0c;我们将介绍"msvcr120.dll"文件的重要性和作用&#xff0c;并探讨当msvcr120.dll丢失怎样修复的办法。以及msvcr12…

Python基础教程——90行Python代码让微信地球转起来!!(完整版,附源码)

今天我们来一个好玩儿的东西&#xff0c;使用90行Python代码就可以让【微信第地球】转起来&#xff0c;太有意思啦&#xff01; 1.微信地球 手机重启后打开微信的一瞬间&#xff0c;会看到一幅有名的图片&#xff0c;上面站着一个张小龙。 你可曾想过这样一个问题&#xff0c…

走向云原生 破局数字化

近年来&#xff0c;随着云计算概念和技术的普及&#xff0c;云原生一词也越来越热门&#xff0c;云原生成为云计算领域的新变量。行业内&#xff0c;华为、阿里巴巴、字节跳动等各个大厂都在“抢滩”云原生市场。行业外&#xff0c;云原生也逐渐出圈&#xff0c;出现在大众视野…