从View Model到Live Data

298 阅读2分钟

Android是一个基于Linux的操作系统,它分为Linux内核、程序库(Android程序库)、Android运行时、应用框架、应用程序五部分。开发者使用Java或Kotlin(一门类似于Java的JVM语言)编写应用程序,用户在安装Android的设备上运行该应用程序。Android应用程序中,描述UI并处理用户和机器屏幕的交互的组件叫Activity一个Activity标识了一个具有用户界面的一个单一屏幕。

仅需数个Activity,便可实现一个简单App中数据获取与处理、UI交互相关的业务逻辑。但是,页面只应该负责接收用户的交互,以及将数据展示到屏幕上,相关数据应该单独存放和处理。对于复杂页面的实现,只用Activity组件实现是不合适的。对此,Android为我们提供了ViewModel类,专门用于存放应用程序页面所需的数据。它将页面所需的数据从页面中剥离出来,页面只需要处理用户交互,以及负责展示数据的工作。ViewModel是介于View(视图)和Model(模型数据)之间的这样一个东西,它起到了桥梁的作用,使得视图和数据既能够分离开,也能够保持通信。此外,ViewModel是独立于配置变化的。ViewModel最重要的作用是,将界面和数据分离,并且独立于Activity的重建。

以一个例子来说明:我们知道,一个Activity标识了一个具有用户界面的一个单一屏幕。 用户将手机屏幕从竖屏向横屏旋转后,竖屏的Activity被销毁,横屏的Activity被重建。这会涉及到数据保存的问题,显然Activity重新请求或加载数据是不友好的。ViewModel 的特殊设计,可以解决此痛点。由于ViewModel是独立于配置变化的,屏幕旋转导致的Activity重建,并不会影响到ViewModel的生命周期。

但要注意的是,ViewModel不支持数据的持久化,当界面彻底销毁,ViewModel及其数据也就不存在了。此外,实现ViewModel到Activity的通信需要通过自定义接口的方式(OnTimeChangeListener)。这不是一种好的方法,实际上Android为我们提供了LiveData组件来解决这个问题。通过LiveData,当ViewModel中的数据发生变化时,Activity能自动收到通知,从而更新UI。LiveData是一个可被观察的数据容器类,它能够感知页面的生命周期。

实际开发中,ViewModel一般配合 LiveData 使用。

参考链接

zhuanlan.zhihu.com/p/76361500

zhuanlan.zhihu.com/p/76747541

www.runoob.com/android/and…