Jetpack架构组件_ViewModel组件_1.简介和示例

2024-08-28 15:04

本文主要是介绍Jetpack架构组件_ViewModel组件_1.简介和示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简介

       ViewModel是我们MVVM中的VM层,ViewModel类似于MVP中的P层,它是我们View层和Model层之间的一个桥梁。

1.1 和MVP的P层的主要区别是:

(1)ViewModel是与我们Android系统挂钩的,是官方的一个类,MV之间的一个桥梁。

(2)ViewModel还保持数据。

1.2 Android为什么要引入ViewModel? 

(1)分层,便于测试和维护;

(2)ViewModel解决了横竖切换时数据丢失的问题。ViewModel生命周期比较长一些,不受横竖屏切换Activity生命周期的影响。

(3)避免因疏忽而导致的内存泄露。onCleared里,写一些释放资源的代码。

1.3 Viewmodel生命周期

         Viewmodel生命周期可以参考官网地址:

ViewModel 概览  |  Android Developers

        图 1 说明了 activity 经历屏幕旋转而后结束时所处的各种生命周期状态。该图还在关联的 activity 生命周期的旁边显示了 ViewModel 的生命周期。此图表说明了 activity 的各种状态。这些基本状态同样适用于 fragment 的生命周期。

图1 ViewModel的生命周期

        通常在系统首次调用 activity 对象的 onCreate() 方法时请求 ViewModel。系统可能会在 activity 的整个生命周期内多次调用 onCreate(),如在旋转设备屏幕时。ViewModel 存在的时间范围是从首次请求 ViewModel 直到 activity 完成并销毁。

 2.代码示例

 2.1新建工程

        选Empty Views Activity。 

项目名:ViewModelDemo ,语言:Java。

 2.2  Activity定义变量

        在activity中定义变量,每次旋转屏幕后会丢失。

        MainActivity.java代码:

package com.gaoting.viewmodeldemo;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {int score;TextView tvScore;Button btAddScore;String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvScore = this.findViewById(R.id.tvScore);btAddScore = this.findViewById(R.id.btAddScore);btAddScore.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {score++;tvScore.setText(String.valueOf(score));}});Log.i(TAG,"onCreate");}@Overrideprotected void onDestroy() {Log.i(TAG,"onDestroy");super.onDestroy();}
}

        activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tvScore"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="成绩:0"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:layout_marginTop="30dp"app:layout_constraintTop_toBottomOf="@+id/tvScore"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"android:text="点我+1"android:id="@+id/btAddScore"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:ignore="MissingConstraints"/></androidx.constraintlayout.widget.ConstraintLayout>

        运行效果:

        点击button,成绩增加到10,然后旋转屏幕发现成绩变成0了。

 2.3变量放在Viewmodel中

         新建MyViewModel类。

         MainActivity.java代码

package com.gaoting.viewmodeldemo;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;public class MainActivity extends AppCompatActivity {TextView tvScore;Button btAddScore;String TAG = "MainActivity";MyViewModel myViewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewModelProvider viewModelProvider = new ViewModelProvider(this,new ViewModelProvider.NewInstanceFactory());myViewModel = viewModelProvider.get(MyViewModel.class);tvScore = this.findViewById(R.id.tvScore);tvScore.setText(String.valueOf(myViewModel.getScore()));btAddScore = this.findViewById(R.id.btAddScore);Log.i(TAG,"score init:"+tvScore.getText() +"vm:"+ myViewModel.getScore());btAddScore.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {myViewModel.addScore();tvScore.setText(String.valueOf(myViewModel.getScore()));}});Log.i(TAG,"onCreate");}@Overrideprotected void onDestroy() {Log.i(TAG,"onDestroy");super.onDestroy();}
}

         MyViewModel.java代码:

package com.gaoting.viewmodeldemo;import android.util.Log;import androidx.lifecycle.ViewModel;public class MyViewModel extends ViewModel {int score;public static final String TAG = "MyViewModel";public int getScore() {return score;}public void addScore(){score++;}@Overrideprotected void onCleared() {Log.i(TAG,"在这儿添加释放资源的代码");super.onCleared();}
}

 运行效果:

        如下图所示,可以看到旋转不会丢失数据。

这篇关于Jetpack架构组件_ViewModel组件_1.简介和示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115101

相关文章

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字