问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JetPack组件学习ViewModel

发布网友 发布时间:2023-08-08 20:27

我来回答

1个回答

热心网友 时间:2023-08-10 08:51

1.需要先创建ViewModel类,继承自ViewModel重写onclear方法,使得页面销毁的时候能够走到自定义的onClear方法中

2 创建ViewModelProvider 在Activity中创建ViewModelProvider实例需要ViewModelOwner作为参数

除此之外还需要一个工厂

该工厂默认实现是获取get函数传入的class反射创建ViewModel实例;也可以自定义工厂函数,会接受一个class的参数只需要返回该实例即可,中间的操作可以自定义

3.通过get传入对应的Viewmodel的Class对象即可。

首先创建ViewModelProvider实例,看下对应源码:

可以看到Fragment和ComponentActivity都实现了该接口

接下来查看ComponentActivity。 1.首次mViewModelStore肯定为null,从nc中取出肯定也取不到只能通过new的方式去创建 2.当经历了屏幕旋转这时候就会从configure中取出viewmodelStore了,对应的也就是第二个红框,最后说明这个流程。

创建完ViewModelProvider后,调用get方法获取Viewmodel实例。

ViewModelStore源码:

答:1.第一次创建 首先会从对应的Activity中的NoLastConfigure获取activity取出对应的ViewModelStore这个时候由于是第一次所以是null, 于是只能new一个ViewModelStore。

2.Activity重建时会销毁页面将ViewmodelStore保存到lastCongiure中并保存到ActivityClientRecord中传递给AMS端。

3.AMS重新调用(这里需要注意如果是配置引起的重建会走RelauchActivity而不是第一次普通的lauchActivity)ReLaunch会通过token取出对应的AcRecord,在attach的时候将record中上一次保存的lastCoinfigure取出来

4.onCreate的时候把store赋值给NoLastConfigure,这个时候页面执行onCreate获取 ViewModelStore就可以获取到了,而且Store是保存着这个页面的所有Viewmodel所以上一次的ViewModel中的数据还在并没有销毁

详细流程: HandlerRelauncherActivity中先调用handlerdestory销毁页面保存重要配置到record中(AMS会保存token{Activity唯一标识}和record的map), 在调用lauchActivity重建页面通过token重新取出record,record在取出configure保存到新创建的activity的属性中。

1.当调用performDestory的时候创建一个Configure类取出viewmodelStore中如果没有直接取到从上一次的configure中取,创建完configure后保存 到record中的lastConfigure属性中。 2.何时重建:在performLaunchActivity方法中调用attach方法,在这个方法中取出record中的lastConfigure赋值给成员变量mLastConfigure

个人感觉: 1.持有V层引用这个很好地解决了,但是回调V层还是得利用很多接口进行传递数据,这种主动通知V层的方式虽然变成接口回调的方式本质上耦合还是严重,可以通过LiveData V层去观察ViewModel中的数据变化这样耦合会降低一些 2.当配置失效比如屏幕旋转会销毁重建Activity,数据虽说可以通过onSavedInstance来传递,但是数据量并不能太大。但是ViewModel是系统原生支持的我们可以直接获取到上次销毁的ViewModel实例数据还在其中 3.具有生命周期可以自动管理防止泄漏,可通过onCleared告知持有该ViewModel的V层销毁 4.缓存命中和创建Viewodel都有回调,可以做自定义处理

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大学入学应该带哪些必备物品? tim删除聊天记录的方法步骤 pc端彻底删除tim聊天记录 甩脂机调到什么档位 如何用甩脂机 甩脂机的正确使用方法 使用抖脂机要注意什么 怎样申请小号微信号 ...的长和宽分别增加6米,扩建后草坪的面积增加了多少 ...扩建后长和宽分别增加10米,扩建后的操场面积增加了多少平方米?_百 ... 长方形的公园它的面积长和宽分别扩大十米后它的平方增加了面积增加了13... 泉州哪里卖凉鞋的(除了中山街) 广州华胜维修质量好吗 银保监会行测考试时间是多久 我的手机 OPPo X905每次打开照相机时,都会出现“请先断开手机与HML的连... 等额本金的利息怎么算 星辰变郭凡结局怎么样 汽车仪表亮DTC故障灯是什么意思 谁可以告诉我摩托车废旧电瓶回收的价格和地方吗 那个小说女主是凤纤舞 托福90分什么概念?高中毕业要多久能达到这个程度。 我的英语基础一般,词汇量在3500左右,现在需要托福考出个90分 苏州乐马优途教育怎么样 烟笼寒水月笼沙是什么季节的景色? 泊秦淮诗中告诉我们是什么季节的句子 有人说“这种纯净水绝对纯净,不含任何离子,饮用有益健康”你认为这种说法对吗? 惠威D3.2 为什么低音软趴趴的呀 苹果手机谁有gsx帐号帮助查一下序列号c6kv94c2JC6f型号mq6m2ch/a是不是官换机 skype关闭来电显示 这么拍水中倒影真的好好看啊 摸了水果要洗几遍手啊 ViewModel原理解析,人人都能看得懂! QQ能设置成某好友上线就自动下线么??? 普通QQ可以定时上下线吗 梦见我已去世的爷爷 梦见肯死去的亲人睡在一起的预兆 喝完999感冒灵后可以喝加多宝吗? 柯南里的小兰的英语老师,还有那个黑衣的长发男子都什么来头?还有那个FBI是干什么的,给我详细说说 大话2转生召唤兽洗成长率 三菱凌悦v3波箱故障码P0810 金毛发情第三天跑出去会不会被配上种? 《婚姻的意义》epub下载在线阅读,求百度网盘云资源 花生占怎么保持脆 百词斩导入自己的单词加逗号怎么弄 请问,女人一次需要多长时间,我在8分钟左右,是不是早泄 24除以6翻译为twenty-four divided by six 。请问为什么是divided而不是divide?麻烦解释一下!谢谢! 求一张大哭的动漫头像 嘴张得很大 扎着两个冲天小辫子 衣服是红色的 脸颊还红红的 谢谢 急用 梦见马变成小孩 梦见水里小白马变小男孩 慈禧指的是什么人物? 清朝的慈禧都有谁?拜托了各位 谢谢