Jetpack之ViewModel

程序员 2024-9-6 09:34:58 67 0 来自 中国
1. 先容

ViewModel 类旨在以留意生命周期的方式存储和管理界面相干的数据。ViewModel 类让数据可在发生屏幕旋转等设置更改后继续留存。
Android 框架可以管理界面控制器(如 Activity 和 Fragment)(记住这个术语,反面分析时会出现)的生命周期。
如果体系烧毁或重新创建界面控制器,则存储在此中的任何瞬态界面相干数据都会丢失。比方,应用可能会在它的某个 Activity 中包含用户列表。为设置更改重新创建 Activity 后,新 Activity 必须重新提取用户列表。对于简单的数据,Activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的捆绑包规复其数据,但此方法仅得当可以序列化再反序列化的少量数据,而不得当数量可能较大的数据,如用户列表或位图。
另一个标题是,界面控制器常常必要举行可能必要一些时间才气返回的异步调用。界面控制器必要管理这些调用,并确保体系在其烧毁后清算这些调用以制止潜伏的内存走漏。此项管理必要大量的维护工作,而且在为设置更改重新创建对象的情况下,会造成资源的浪费,由于对象可能必要重新发出已经发出过的调用。
简单明确:

  • 页面烧毁时会打扫数据,重修时又会重新哀求,而烧毁的数据和打扫的数据是一样的,如许会浪费资源
  • 页面在异步哀求数据过程中被烧毁,而异步使用没有被取消可能会导致内存走漏和浪费资源,比方:用户进入列表页面,在列表网络数据没有返回时退出页面,这时如果不取消网络是会造成资源浪费
  • ViewModel 能感知 Activity或Fragment 的生命周期的改变,在 Activity或Fragment 烧毁时实验一些数据清算工作(ViewModel 的实现类可以通过重写onCleared方法)。
2. 结论


  • Activity 持有一个ViewModelStore,其用到的ViewModel都存储到此中;Fragment持有FragmentManager,FragmentManager持有FragmentManagerViewModel,在FragmentManagerViewModel中维护了Fragment使用的ViewModelStore;即Activity和Fragment都各自持有自己的ViewModelStore,而Fragment的ViewModelStore间接来自Activity
  • ViewModel能在烧毁重修过程中生存数据,是由于在烧毁时生存了ViewModelStore,在重修时重新获取了旧的ViewModelStore,再从ViewModelStore中获取ViewModel,进而ViewModel中持有的数据还在
  • 应用处于背景时,由于内存不敷导致Activity被烧毁,这时的ViewModel是无法规复数据的,由于ViewModel是暂存再应用历程,应用历程被杀掉数据也就不存在了,而onSaveInstanceState是可以的(见文末参考)
3. 使用

ViewModel使用非常简单

  • 添加依赖,反面的源码分析也是基于此版本,差别版本源码可能不一样
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 18:29, Processed in 0.167454 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表