目录
一、LiveData
官方文档:LiveData
LiveData 主要用于观察数据变动与更新
1.1 优点
- 数据变更时更新UI
- 没有内存泄露
- 无需手动处理生命周期
- 共享资源
- 不会因为停止 Activity 崩溃
1.2 常用方法
方法名 | 描述 |
---|---|
observe(@NonNull LifecycleOwner, @NonNull Observer<T> observer) | 设置数据变更后处理的监听。 |
setValue | 设置数据,只能在主线程调用,在其他线程调用会抛出异常。 |
getValue | 获取数据。 |
postValue | 向主线程设置数据。如果在主线程调用,不一定会立即执行。 |
1.3 原理
在 observe 方法中,将 Owner 与 observer 绑定,信息放入 LifecycleBoundObserver。
LifecycleBoundObserver 交给 LifecycleRegistry 注册。Owner 持有 LifecycRegistry。
Owner 生命周期变更时,LifecycleBoundObserver 会接到响应,然后通知活跃的 observer 执行。
Owner 活跃状态,onStart、onResume、onPause。
Owner destroy 时,会解绑 observer,防止内存泄露。
二、ViewModel
官方文档:ViewModel
ViewModel 用于存储和管理和UI相关的数据,并且在配置更改时数据不会消失。
ViewModel 生命周期:
1.1 ViewModel 怎么保存和恢复
在配置更改时,会调用 Activity#onRetainNonConfigurationInstance() 来保存保存着 ViewModel 实例的对象 mViewModelStore,并在 Activity 重建后调用 getViewModelStore(),其中会调用 ensureViewModelStore()。在它内部会调用 getLastNonConfigurationInstance() 方法获取是否有缓存的 ViewModelStore 对象,若有则返回,没有则创建新 ViewModelStore 实例。