ViewModel - SMAXLYB/JetpackPractice GitHub Wiki

ViewModel

  • Activity/Fragment负责UI展示与交互,与数据相关的业务逻辑应该单独存放,ViewModel为此而生,专门存放数据,并且ViewModel的生命周期比Activity和Fragment都要长,此时不用考虑数据的存储和恢复问题,但也仅限于配置发生变化,如果是应用进程被系统杀死,那么ViewModel也会丢失,解决方案是配置SavedState使用 ViewModel生命周期

  • Activity/Fragment都实现了ViewModelStoreOwner接口,有一个getViewModelStore方法,返回VeiwModelStore,内部实现是HashMap<String, ViewModel>,如果需要自定义的ViewModel时,会通过ViewModelProvider检查V自定义iewModel是否存在,如果不存在就新建,所以是独立于页面而存在的。

  • 一般不允许ViewModel持有context,会造成内存泄露,如果需要,可以使用AndroidViewModel类,使用Application作为context 对于配置发生变化,onSaveInstanceState()可以保存少量、支持序列化的数据,可持久化,在磁盘中,ViewModel可以保存任何数据,不可持久化,在内存中

  • 使用方法:

  1. 添加lifecycle-viewmodel依赖,新建类继承自viewmodel,将数据存放于此类中,对外暴露数据变动监听方法
  2. 在activity/fragment中,调用ViewModelProvider(fragment/activity).get(viewmodel.class)获取自定义的viewmodel,对viewmodel中的数据进行操作即可,如有需要,可以添加数据变动监听