| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android JetPack 之 ViewModel 使用及源码分析 -> 正文阅读 |
|
[移动开发]Android JetPack 之 ViewModel 使用及源码分析 |
这是摘抄自官网的一段话:? 传送门 在使用Android提供的四大组件开发应用时,自身的业务还要结合组件的生命周期,各组件都有自己的生命周期,如Activity的生命周期: onCreate ==> onStart ==> onResume ==> runing....? ==> onPause?==> onStop ==> onDestory 设想一种场景 业务首页 要展示一个用户列表项,这个用户列表项中的数据是从服务器拉取下来的,这个拉取数据的动作,放在了 onCreate中,这是很常见的一种写法:
这样写在一般情况下没啥毛病,但是如果考虑以下两种情况,就会发现有问题: 1、用户进入业务首页,触发onCreate方法,然后正常下拉数据,数据拉取到之后更新UI展示给用户。但在这使用过程中,用户旋转手机,手机由竖屏变为横屏,也就触发了Android系统中所谓的配置变化,当配置变化发生时,用户正在使用的Activity就会经历:销毁、重建。 销毁、就会导致已经拉取到的数据被回收,重建之后又会调用onCreate方法,再次请求服务器拉取数据。 2、除了第一种情况外,还要考虑一下这种场景:用户进入业务首页 触发onCreate方法,下拉数据,但是下拉数据的过程由于网络原因可能非常慢,在这期间用户切换到其他APP去了,那么当前这个正在拉取数据的Activity就由可见状态变为了不可见状态,体现到Activity生命周期: onResume ==> onPause ==> onStop 好巧不巧,用户正在其他APP上愉快的玩耍时,你的Activity已经成功从服务器端拉取到了数据,并将数据传送到Activity上,然后触发展示UI的操作。你的业务在展示UI时会有炫酷的动画效果,但这并没啥用,因为用户正在其他APP上玩耍,根本看不到这动画效果。其实正常的流程应该是当前Activity为可见状态时才触发展示UI操作。 基于上述两种情况,不难发现,我们自身的业务其实是要和Activity的生命周期紧密结合的,在适当的时候保留数据、展示UI。 其实要解决上述两个问题不是啥难事,像是数据由于屏幕旋转被销毁、重建,完全可以把第一次拉取到的数据放到一个静态成员上、又或者是通过系统调用的onSaveInstanceState()方法保留数据,随后在? onCreate? -> Bundle savedInstanceState 中获取到数据,对于第二种情况也可以根据当前Activity的生命周期来判断是否展示UI等。 使用ViewModel就可以优雅的解决上述问题了 ViewModel常规使用:
这里面涉及到的LiveData在本篇中不予讨论,有MVVM开发模式经验的伙伴肯定都知道这是个啥,这里只重点讨论ViewModel。 看一张ViewModel的生命周期图,再结合上面的ViewModel简单应用: ?这张图来自官网: 传送门 ?疑惑: ?这段获取mViewModel的代码也是写在onCreate方法中的:
那么在发生屏幕旋转导致的Activity销毁、重建后调用了onCreate,那岂不是又重写创建了ViewModel? ViewModel到底是如何实现经历销毁、重建后仍然保留之前的数据呢?带着这样的疑问来分析分析ViewModel的源码就会明白了。 看切入的第一个类 ViewModelProvider 的构造方法:
最终是调用到第三个构造函数,他做了一件很简单的事情,那就是为类实例成员编译赋值 ViewModelStore ->>> 存储ViewModel的一个容器,后面会分析 Factory ->>> 创建ViewModel的工厂类 继续看这一句:
创建了ViewModelProvider 之后,又调用了ViewModelProvider 的 get 方法,传入一个Class类型的参数,根据传入的类型,由Factory帮我们创建这个类的实例。
上面的逻辑大致可以总结为: 1、尝试从ViewModelStore中获取所需的实例 2、如果第一步中成功获取到所需的实例对象,那么就可以返回了 3、如果第一步中返回的是null,那么就由Factory来创建这个所需的实例,创建之后的实例存入到ViewModelStore中,这个ViewModelStore相当于一个缓存容器。 ViewModelStore是个啥呢? 其实看它提供的操作,很容易看出这就是一个容器罢了,瞄一眼它的代码:
果然,就是个容器。。。 回头看,探索源码的目的是为了了解,ViewModel是如何实现Activity经过销毁、重建后仍然可以保留数据的,但是分析至此,也没发现有什么特别的地方,还是不能解释 ViewModel的生命周期。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/31 6:21:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |