LiveData 介绍
LiveData 是 Google 推荐的 Android 架构组件之一,属于 Jetpack 库的一部分。它是一个存放可被观察的数据持有类,具备生命周期感知功能,有效解决了 Android 开发者在处理 UI 更新时需要手动管理生命周期的痛点。
例如,在使用 Retrofit+RxJava 处理接口回调数据时,开发者必须考虑 Activity 或 Fragment 的生命周期,以防止在 onStop 或 onDestroy 之后收到回调导致崩溃。现在只需使用 Retrofit+LiveData,其余的生命周期处理工作由 LiveData 自动完成。
LiveData 核心优势
1. 保证 UI 与数据同步
LiveData 遵循观察者模式,并会在生命周期状态变化时通知观察者。它优雅地处理了生命周期问题,并非所有数据变化都会触发回调,只有在观察者处于活跃状态(Active)时才会通知,因此可以在回调中安全地执行 UI 更新操作。
2. 避免内存泄漏
观察者都是绑定 Lifecycle 的。当 LifecycleOwner(如 Activity)销毁时,LiveData 会自动移除观察者,从而防止因强引用导致的内存泄漏。
3. 非活跃状态不崩溃
LiveData 将 Activity 生命周期合并分为 inactive 与 active 两种状态(start 与 resume 为 active,其他为 inactive)。处于非活跃(inactive)状态时,不会收到 LiveData 的任何事件通知,避免了在非可见状态下更新 UI 导致的异常。
4. 无需手动管理生命周期
UI 组件只需要关心相关的数据,不需要去手动变换生命周期状态,LiveData 已经帮你搞定了。这大大降低了代码复杂度。
5. 及时更新最新的数据
简单来说,LiveData 在生命周期非活状态(inactive)期间,如果数据发生变化,当状态变为活状态(active)的时候,会回调一次最终的数据。这确保了用户重新进入页面时能看到最新状态。
6. 适应屏幕旋转的数据保存
像屏幕旋转导致的 Activity 或 Fragment 重创建之后,LiveData 会立即通知一下相应的观察者。由于 LiveData 存储在 ViewModel 中,配置更改后数据不会丢失,保证了用户体验的连续性。
7. 共享资源
您可以使用单例模式扩展 LiveData 对象并包装成系统服务,以便在应用程序中进行共享。LiveData 对象一旦连接到系统服务,任何需要该资源的 Observer 都只需观察这个 LiveData 对象,实现了数据的集中管理。
如何使用 LiveData?
- 创建实例:创建一个 LiveData 的实例来保存特定类型的数据。这通常在 ViewModel 类中完成。
- 定义观察者:创建一个定义了 onChanged() 方法的 Observer 对象,当 LiveData 对象保存的数据发生变化时,onChanged() 方法可以进行相应的处理。您通常在 UI 控制器(如 Activity 或 Fragment)中创建 Observer 对象。
- 注册观察者:使用 observe() 方法将 Observer 对象注册到 LiveData 对象。observe() 方法还需要一个 LifecycleOwner 对象作为参数。Observer 对象订阅了 LiveData 对象,便会在数据发生变化时发出通知。
注意:可以使用 observeForever(Observer) 方法注册一个没有关联 LifecycleOwner 对象的 Observer。在这种情况下,Observer 被认为始终处于活动状态,因此当有数据变化时总是会被通知。您可以调用 removeObserver(Observer) 方法移除这些 Observer。
当你更新 LiveData 对象中存储的数据时,所有注册了的 Observer,只要所绑定的 LifecycleOwner 处于活动状态,就会被触发通知。LiveData 允许 UI 控制器 Observer 订阅更新。当 LiveData 对象所保存的数据发生变化时,UI 会在响应中自动更新。
创建 LiveData 对象
LiveData 是一个包装器,可用于任何数据,包括实现 Collections 的对象,如 List。一个 LiveData 对象通常存储在 ViewModel 对象中,并通过 getter 方法访问。
public class {
MutableLiveData<String> mCurrentName;
MutableLiveData<String> {
(mCurrentName == ) {
mCurrentName = <>();
}
mCurrentName;
}
}


