外观
ViewModel 为什么能保留页面状态?
标准回答
ViewModel 由 ViewModelStoreOwner 管理。配置变化重建 Activity / Fragment 时,可以复用同一作用域里的 ViewModel,因此正在进行的状态管理不必随 View 一起重建。
关键机制
- 作用域结束时会清理,例如 Activity 真正 finish;导航图或 Fragment 也可以提供自己的作用域。
- UI 用 Lifecycle 感知的方式观察状态,避免不可见时仍做无意义的界面工作。
- 进程被杀后 ViewModel 对象消失;小量恢复信息交给 SavedStateHandle,业务数据交给持久层。
通俗例子
屏幕旋转只是换了“展示窗口”,设备列表和加载状态还由同一个 ViewModel 管理;重新打开已结束的页面通常会得到新的实例。
易混淆点
缓存了对象不等于所有问题自动解决。并发刷新、错误重试、一次性动作重复消费仍要设计。
参考资料
内容来源
- Android 技术札记 · 原条目
viewmodel