Android开发中的ViewModel

news/2024/9/29 16:01:48 标签: android

在Android应用开发中,ViewModel作为架构组件之一,扮演着管理UI数据和生命周期的关键角色。本文将深入探讨ViewModel如何感知View的生命周期,并分析其内核原理,帮助开发者更好地利用ViewModel优化应用架构。

一、ViewModel简介

在Android开发中,随着应用复杂度的提升,如何有效管理UI组件的生命周期和数据成为了一个挑战。ViewModel作为Android Architecture Components的一部分,应运而生。它允许我们存储和管理与UI相关的数据,同时在配置更改(如屏幕旋转)时,保持数据的持续性。

二、ViewModel的核心优势

  1. 生命周期感知:ViewModel能够感知到其宿主Activity或Fragment的生命周期,确保在适当的时候进行数据的保存和恢复。
  2. 数据持久化:ViewModel能够在Activity或Fragment重建时,保持其内部状态,避免因生命周期变化导致的数据丢失。
  3. 与UI层解耦:ViewModel独立于UI层,使得业务逻辑与UI展示分离,提高了代码的可维护性和可测试性。

                     上图左侧为 Activity 的生命周期过程,期间有一个旋转屏幕的操作;右侧则为
  ViewModel 的生命周期过程。

三、ViewModel如何感知生命周期

ViewModel通过与Activity或Fragment的生命周期挂钩,来感知生命周期的变化。当Activity或Fragment被销毁时,关联的ViewModel会暂停数据更新,直到新的Activity或Fragment重新绑定并请求数据。

四、ViewModel内核原理

  1. 初始化:当Activity或Fragment创建时,ViewModel通过ViewModelProvider初始化。ViewModelProvider负责创建和维护ViewModel的实例。

  2. 数据存储:ViewModel内部可以使用LiveData、MutableLiveData等数据存储类,来存储和管理UI相关的数据。

五、实战案例

以下是一个简单的ViewModel使用示例:

public class MyViewModel extends ViewModel {
    private MutableLiveData<String> myData = new MutableLiveData<>();

    public LiveData<String> getData() {
        return myData;
    }

    public void setData(String data) {
        myData.setValue(data);
    }
}

// 在Activity中使用ViewModel
public class MyActivity extends AppCompatActivity {
    private MyViewModel myViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
        myViewModel.getData().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                // 更新UI
            }
        });

        // 设置数据
        myViewModel.setData("Hello, ViewModel!");
    }
}

六、总结

ViewModel作为Android架构组件之一,为管理UI相关数据和生命周期提供了强大的支持。通过理解ViewModel的生命周期感知机制和内核原理,我们可以更好地构建健壮、高效的Android应用。


http://www.niftyadmin.cn/n/5683316.html

相关文章

count(1),count(*)与 count(‘列名‘) 的区别

文章目录 COUNT(expr)性能对比count(*) VS count(1)count(*) VS count(列名) count(*)会走索引吗MyISAM count优化InnoDB如何处理count(*)总结 参考官方文档&#xff1a; https://dev.mysql.com/doc/refman/8.4/en/aggregate-functions.html#function_count COUNT(expr) coun…

python模块之getopt

getopt.getopt(args, shortopts, longopts[]) 解析命令行选项及参数列表。 args&#xff1a;要解析的参数列表&#xff0c;但不包括当前执行的python脚本名称&#xff0c;一般等同于sys.argv[1:]。 shortopts&#xff1a;要识别的短选项字符串&#xff0c;如果后接:表示需要…

复试经验分享《一、问答题自测》(408、相关前沿技术)

复试经验分享 一、问答题目自测 优化界面的博客链接 1. 数据结构 1.1 请简述深度优先遍历、广度优先遍历的基本思想 栈、队列。 1.2 简述满二叉树&#xff0c;完全二叉树&#xff0c;二叉排序树&#xff0c;平衡二叉树的特性 1.3 什么是队列的上溢现象和假溢出现象? 解决…

SIGCHLD` 信号详解

SIGCHLD 信号详解 SIGCHLD 信号是专门用于父进程处理子进程状态变化的信号。在 Unix 和 Linux 系统中,当子进程的状态发生变化时,内核会向其父进程发送 SIGCHLD 信号,以通知父进程子进程的终止或状态变更。 1. SIGCHLD 信号的触发条件 SIGCHLD 信号通常在以下几种情况下被…

解锁电商新趋势:探索循环购物模式的盈利与乐趣

亲爱的读者朋友们&#xff0c;今天我将向大家介绍一种新颖的电子商务模式——循环购物模式。你是否好奇&#xff0c;在某些购物平台上&#xff0c;消费1000元为何能获得超过2000元的价值回馈&#xff1f;并且每天还有额外的返现可以领取&#xff0c;这些钱还能轻松提现&#xf…

网络安全法中,个人信息保护的措施和原则有哪些?

《中华人民共和国网络安全法》中关于个人信息保护的规定强调了几项基本原则和措施&#xff0c;以确保个人信息的安全。以下是其中的一些要点&#xff1a; 原则 合法性&#xff1a;个人信息的收集和使用必须符合法律规定。 正当性&#xff1a;信息收集和使用的目的是正当的&…

Golang | Leetcode Golang题解之第442题数组中重复的数据

题目&#xff1a; 题解&#xff1a; func findDuplicates(nums []int) (ans []int) {for _, x : range nums {if x < 0 {x -x}if nums[x-1] > 0 {nums[x-1] - nums[x-1]} else {ans append(ans, x)}}return }

python【入门基础知识】

目录 1、字面量 2、标识符 3、关键字 4、变量 变量的定义 变量的命名 5、注释 单行注释 多行注释 6、行与缩进 多行语句 7、运算符 分类 优先级 8、编程规范 1、字面量 含义&#xff1a;程序中直接写出来固定的值&#xff0c;不是变量或表达式。 分类&#xf…