Android Jetpack架构组件之LiveData

354 阅读3分钟

image.png

前言

如何快速高效的掌握一门学问,建议先阅读下这篇文章关于学习的一些看法

一、概述

LiveData 是一种可观察的数据存储器类。具有生命周期感知能力,可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者

二、设计目的

  • 数据驱动UILiveData 设计的初衷是实现数据驱动的UI更新,确保数据与UI状态始终保持同步。它适用于MVVM、MVI架构中,作为ViewModel与UI组件之间的桥梁,传递可观察的数据。
  • 生命周期感知LiveData 能够感知与其关联的 LifecycleOwner 的生命周期状态,自动管理数据订阅与通知,避免在组件不可见或已销毁时仍进行不必要的更新,从而节省资源防止内存泄漏

三、关键组件与接口

  • LiveData:核心类,提供可观察数据容器的功能。它继承自LifecycleBoundObserver,并实现了Observer接口。
  • MutableLiveDataLiveData 的子类,提供设置新值的方法(setValue(T)、postValue(T)),允许外部修改数据。
  • Observer<T>:观察者接口,定义了当数据发生变化时的回调方法onChanged(T)。

四、实现原理与工作机制

  • 观察者注册与通知:
    • observe(LifecycleOwner, Observer<T>):将观察者与LifecycleOwner关联,当LiveData的值发生变化且LifecycleOwner处于活跃状态(STARTED或RESUMED)时,观察者会收到通知。
    • removeObserver(Observer<T>):解除观察者与LiveData的关联,不再接收数据更新通知。
  • 生命周期感知:
    • LifecycleBoundObserver:LiveData内部持有LifecycleBoundObserver实例,它实现了LifecycleEventObserver接口,监听LifecycleOwner的生命周期事件。
    • 状态转换:当LifecycleOwner的生命周期状态变化时,LiveData会根据状态判断是否应该继续通知观察者。若处于非活跃状态,通知将暂停;回到活跃状态后,会重新发送最后一次更新的数据。
  • 数据变化通知:
    • setValue(T):在主线程中直接设置新值并立即通知观察者。若不在主线程调用,会抛出异常。
    • postValue(T):在主线程的MessageQueue中安排一个任务来设置新值,如果当前就在主线程,会立即执行。这保证了即使在后台线程中调用也能安全地更新数据。

五、最佳实践与注意事项

  • 遵循单向数据流:避免在UI组件中直接修改LiveData的值,应通过ViewModel操作数据,确保数据流向的清晰和可控。
  • 合理使用observeForever(Observer<T>):该方法使观察者不受生命周期影响,始终接收数据更新。仅在特定场景(如后台任务、单元测试)中使用,并确保适时调用removeObserver(Observer<T>)
  • 避免循环依赖:在ViewModel之间或ViewModel与Repository之间使用LiveData时,应注意避免循环依赖导致的数据更新死循环。

六、扩展功能与特性

  • 转换操作:通过Transformations类提供的方法(如map()、switchMap()、distinctUntilChanged()等)对LiveData进行链式操作,对数据进行变换或过滤后再传递给观察者。
  • 组合多个LiveData:使用MediatorLiveData可以合并多个LiveData源,根据需要合成新的数据流。
  • LiveDataReactiveStreams:用于将RxJava、Kotlin Flow等响应式编程库与LiveData桥接,实现数据流的互操作。

码字不易,记得关注 + 点赞 + 收藏