1. 什么是ViewModel
我们先来试着了解一下,为什么叫做“ViewModel”这个名字?(以下是个人的解读)将ViewModel就可以拆成 “View”和“Model”。
- View:就是我们看到的UI界面。例如常见的实现了 lifecycleOwner 的Fragment、activity、自定义View等等。View应该专注于处理UI界面的展示。
- Model:就是数据的获取类。例如:网络请求、数据库读取等等。
- ViewModel:就是介于View和Model这两个之间存在的一个组件,连接着View和Model。负责存储和处理UI界面需要的所有数据。数据来源来自Model,在ViewModel中对数据进行处理,View会监听ViewModel中数据的变化从而进行UI上的响应。所以ViewModel绝不会,也不应该访问视图层次结构(例如视图绑定对象)或存储对 activity 或 fragment 的引用。
2. ViewModel的生命周期
ViewModel 对象存在的时间范围是获取 ViewModel 时传递给 ViewModelProvider 的 Lifecycle。ViewModel 将一直留在内存中,直到限定其存在时间范围的 Lifecycle 永久消失:对于 activity,是在 activity 完成时;而对于 fragment,是在 fragment 分离时。(因为 ViewModel 存储在 activity/fragment 中的 ViewModelStore 中)。 其实可以认为存在的时间范围是从您首次请求 ViewModel 直到 LifecycleOwner 完成并销毁。 所以在使用ViewModel的时候我们最好是在实现了 LifecycleOwner 的对象上使用,防止出现OOM。 下面借鉴以下官方的图:
3. 怎么使用ViewModel
MVVM的出现,MVP也渐渐被MVVM所替代,这里的MVVM就指的是包含ViewModel的。在使用ViewModel的同时,通常也会将 LiveData 搭配使用。
- LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
- 当 LifecycleOwner 处于活动状态时,才会通知此观察者有关包装数据的修改。即 状态必须是STARTED 以上的活跃状态,才会收到通知。
- 当 处于 DESTROYED 状态时,将添加了 Lifecycle 的观察者将被自动删除。LifecycleOwner 可以安全地观察 LiveData 而不必担心泄漏,当它们被销毁时,它们将立即取消订阅。
|