Comments (7)
非也,配置发生变化时,仍然是基于同一个 Activity 实例,不然就谈不上对已保存状态的恢复了。
对 Activity 自身来说只是重走了一次生命周期流程,具体需结合实际场景理解。
from jetpack-mvvm-best-practice.
非也,配置发生变化时,仍然是基于同一个 Activity 实例,不然就谈不上对已保存状态的恢复了。
对 Activity 自身来说只是重走了一次生命周期流程,具体需结合实际场景理解。
刚开始我也认为是同一个实例(清单文件是默认的launchMode),调试后,发现前后的activity对象的hashCode不一样,说明是两个实例,在配置发生变化时,在对象销毁之前,会存储上一个activity实例的viewModelStore对象,恢复时会取viewModelStore
from jetpack-mvvm-best-practice.
@hanshengjian 很抱歉提供了有出入的解答,刚刚在 onCreate 节点重新测试了一下,确实当旋屏重建时得到的 Activity hashCode 发生了变化。
感谢你对这一现象的观察、思考和分享。
据我过去一年的观察,ViewModel 在 Activity/Fragment 源码中的设计一直在发生变化,所以在对 google 未来的决策背景一无所知的情况下,我暂时无法就未来 ViewModel、Activity/Fragment 源码的设计方向做更多探讨。
Jetpack ViewModel 试图成为当前条件下,解决重量级(例如需要透过 https 网络请求来获取的耗时间、耗电能的)状态的托管和恢复的 “最优解”,所以它并不一定是完美的,也可能存在如你所说的这一缺憾。
所以也可尝试对 demo 做内存泄漏的测试,如该设计的崩溃率能控制在商业角度可接受的比例,我们仍可在权衡利弊后考虑使用 ViewModel 来为我们规避其他更高频、负面影响更大的问题。
from jetpack-mvvm-best-practice.
后面如果内存泄漏的测试,和你一起在探讨下这个问题.按照你的思路,去理解ViewModel,跳出了MVVM,确实有了更深的理解,ViewModel 对App开发来讲,相比其他的业务开发模式,少操心很多事.也很感谢你写MVVM精讲这篇文章,最近在复习面试,按照这个思路去面试,就像你之前分享出来的小伙伴说的,能把VM说的更加饱满.
from jetpack-mvvm-best-practice.
from jetpack-mvvm-best-practice.
@KunMinX 理解了,我看了下配置发生变化时保存的具体对象是viewModelStore,这个对象具体activity的属性,它有个属性mMap,存储了所有的viewModel,通过ViewModelProvider.get()方法时,先获取最后配置变化的viewModelStore,然后从mMap中获取viewModel.理解了这个原理,也有一个小想法,就是viewModelStore是activity的对象,配置发生变化时,因为viewModelStore被保存下来了,所以旧的activity回收不了,感觉也是一个内存泄漏.
Originally posted by @hanshengjian in #41 (comment)
这里有一个问题,想请教一下,你说的viewModelStore会拥有Activity的属性,从哪里看出来呢?
ViewModelStore有mMap,mMap保存ViewModel实例,然而ViewModel并不会有Activity的属性啊
我的理解是,ViewModelStore并没有Activity的属性,也不会导致旧的Activity回收不了
from jetpack-mvvm-best-practice.
@KunMinX 理解了,我看了下配置发生变化时保存的具体对象是viewModelStore,这个对象具体activity的属性,它有个属性mMap,存储了所有的viewModel,通过ViewModelProvider.get()方法时,先获取最后配置变化的viewModelStore,然后从mMap中获取viewModel.理解了这个原理,也有一个小想法,就是viewModelStore是activity的对象,配置发生变化时,因为viewModelStore被保存下来了,所以旧的activity回收不了,感觉也是一个内存泄漏.
Originally posted by @hanshengjian in #41 (comment)这里有一个问题,想请教一下,你说的viewModelStore会拥有Activity的属性,从哪里看出来呢? ViewModelStore有mMap,mMap保存ViewModel实例,然而ViewModel并不会有Activity的属性啊 我的理解是,ViewModelStore并没有Activity的属性,也不会导致旧的Activity回收不了
赞同你的观点。感觉前面那位老哥,没理明白内存泄露。
from jetpack-mvvm-best-practice.
Related Issues (20)
- Navigation 启动新页面并关闭当前页面的功能如何实现? HOT 1
- 框架设计咨询 HOT 1
- ShareViewModel的一些疑问 HOT 4
- 底部播放器提示风险警告水印:”PlayerFragment 未遵循 Databinding 严格模式,存在 null 安全风险“ HOT 7
- 下载模拟显示问题 HOT 1
- PlayerFragment does not follow the DataBinding strict mode, there is a Null security risk of view calls. HOT 1
- 在 Activity 或 Fragment 不直接获取 View 的话,如何手动控制焦点(focus)? HOT 2
- APP点击搜索框时崩溃 HOT 5
- 能否解决navigation args在多个模块传数据的问题? HOT 1
- ui.state.State在哪? HOT 1
- 请教在使用Databinding时Activity不获取 view 实例的原则下, Activity如何调用自定义View的方法, HOT 1
- [个人见解] 本项目的设计对于简单需求过于复杂,导致预期修改正确比较困难。 搜索了一下 login 这个功能点,该页面的正确性关联7个文件。 HOT 1
- 两个Activity如何共用一个ViewModel? HOT 1
- RecyclerView列表多项同时发送请求,如何优雅实现?
- 继承MviDispatcher的类,使用getApplicationScopeViewModel()创建,App覆盖安装apk自动重启app的时候,会报错Cannot add the same observer with different lifecycles
- cannot fid BaseAlbumItem
- 进入主页后,左滑或者右滑退回桌面,再次打开后,播放列表数据为空 HOT 1
- 快速点击播放按钮, Crash HOT 1
- 为什么不转成kotlin HOT 1
- RecyclerView中的适配器问题
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jetpack-mvvm-best-practice.