ViewModel类是用来存储和管理与UI相关的数据,在设计之初就考虑到生命周期的影响。ViewModel允许数据在屏幕旋转等配置变化后存活。
Android framework管理UI控制器(如Activity和Fragment)的生命周期。 framework可能会决定销毁或重新创建UI控制器,以响应完全不受控制的某些用户操作或设备事件。
如果系统销毁或重新创建UI控制器,则存储在其中的所有临时的UI相关数据都将丢失。 举个例子,您的应用中的一个Activity可能包含用户列表。 当因配置更改重新创建Activity时,新Activity必须重新获取用户列表。 对于简单数据,活动可以使用onSaveInstanceState()方法并从onCreate()中的数据包中恢复其数据,但是此方法仅适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大量数据,例如用户列表或位图。
另一个问题是UI控制器经常需要异步请求,需要一些时间才能获取结果。 UI控制器需要管理这些请求,确保在系统销毁自己时,清理这些请求以避免潜在的内存泄漏。 这种管理需要大量的维护代码,并且在因配置更改而重新创建UI控制器的时,可能不得不重新发出已经发出过的请求,这样会浪费许多资源。
UI控制器(如Activity和Fragment)主要用于显示UI数据,对用户操作做出响应,或处理与操作系统之间的通信(如权限请求)。 再让UI控制器负责从数据库或网络加载数据,会导致该类过度臃肿。 给UI控制器分配过多的工作,可能会导致一个类去单独处理应用程序的所有工作,而不是将工作委托给其他类。 给UI控制器分配过多的工作也使得测试工作变得更加困难。
将视图数据的所有权从UI控制器逻辑中分离出来,会让项目更简单,更高效。