LiveData源码赏析 —— 基本使用

兄弟姐妹们有没有人讲详细点的我想教一下,LiveData源码赏析 —— 基本使用
最新回答
只想待在家

2026-02-24 13:21:55

LiveData 是 Android Jetpack 架构组件中用于数据观察的核心类,其设计实现了生命周期感知和线程安全的数据分发。以下从源码角度解析其基本使用机制:

1. 核心类关系
  • LiveData:抽象基类,定义数据持有和分发逻辑。
  • MutableLiveData:LiveData 的可变子类,提供 setValue() 和 postValue() 方法修改数据。
  • Observer:数据变化回调接口,需在主线程接收通知。
2. 观察者注册流程(1) observe() 方法@MainThreadpublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { // 1. 校验主线程 assertMainThread("observe"); // 2. 忽略已销毁的LifecycleOwner if (owner.getLifecycle().getCurrentState() == DESTROYED) return; // 3. 包装观察者 LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); // 4. 存储观察者(线程安全) ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); if (existing != null && !existing.isAttachedTo(owner)) { throw new IllegalArgumentException("Cannot add the same observer with different lifecycles"); } if (existing != null) return; // 5. 绑定生命周期 owner.getLifecycle().addObserver(wrapper);}

关键点:

  • 主线程校验:通过 assertMainThread() 确保线程安全。
  • 生命周期过滤:已销毁的 LifecycleOwner 会被直接忽略。
  • 观察者包装:LifecycleBoundObserver 实现了 LifecycleEventObserver,用于监听生命周期事件。
  • 唯一性检查:禁止同一 Observer 绑定不同 LifecycleOwner。
(2) observeForever() 方法@MainThreadpublic void observeForever(@NonNull Observer<? super T> observer) { assertMainThread("observeForever"); AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer); ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); if (existing instanceof LiveData.LifecycleBoundObserver) { throw new IllegalArgumentException("Cannot add the same observer with different lifecycles"); } if (existing != null) return; wrapper.activeStateChanged(true); // 立即激活}

与 observe() 的区别:

  • 无生命周期绑定:使用 AlwaysActiveObserver,始终视为活跃状态。
  • 需手动移除:需调用 removeObserver() 避免内存泄漏。
3. 生命周期感知实现LifecycleBoundObserver 核心逻辑class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver { @Override boolean shouldBeActive() { return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED); } @Override public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) { if (mOwner.getLifecycle().getCurrentState() == DESTROYED) { removeObserver(mObserver); // 自动移除DESTROYED的观察者 return; } activeStateChanged(shouldBeActive()); // 根据生命周期状态分发数据 }}

机制:

  • 活跃状态判断:仅当生命周期 ≥ STARTED 时才分发数据。
  • 自动清理:在 DESTROYED 状态时移除观察者,防止内存泄漏。
4. 数据分发流程(1) 数据更新方法
  • setValue():主线程直接更新数据并触发分发。
  • postValue():通过 Handler 切换到主线程更新数据。
(2) 分发逻辑private void dispatchingValue(ObserverWrapper initiator) { if (mDispatchingValue) { mDispatchInvalidated = true; return; } mDispatchingValue = true; do { mDispatchInvalidated = false; for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator = mObservers.iteratorWithAdditions(); iterator.hasNext(); ) { considerNotify(iterator.next().getValue()); } } while (mDispatchInvalidated); mDispatchingValue = false;}private void considerNotify(ObserverWrapper observer) { if (!observer.mActive) return; if (!observer.shouldBeActive()) return; if (observer.mLastVersion >= mVersion) return; // 避免重复通知 observer.mObserver.onChanged((T) mData); observer.mLastVersion = mVersion;}

关键点:

  • 活跃状态检查:仅通知活跃的观察者。
  • 版本控制:通过 mVersion 避免旧数据重复分发。
  • 线程安全:mDispatchingValue 标志位防止并发问题。
5. 观察者移除逻辑@MainThreadpublic void removeObserver(@NonNull final Observer<? super T> observer) { assertMainThread("removeObserver"); ObserverWrapper removed = mObservers.remove(observer); if (removed == null) return; removed.detachObserver(); // 解绑生命周期 removed.activeStateChanged(false); // 标记为非活跃}

作用:

  • 清理 mObservers 中的观察者引用。
  • 调用 detachObserver() 移除生命周期监听(如 LifecycleBoundObserver)。
6. 活跃状态统计

通过 changeActiveCounter() 统计活跃观察者数量,触发 onActive()/onInactive():

void changeActiveCounter(int change) { mActiveCount += change; if (mActiveCount == 1) onActive(); // 首个活跃观察者 else if (mActiveCount == 0) onInactive(); // 最后一个活跃观察者}

用途:子类可重写这两个方法实现资源管理(如 MediatorLiveData)。

总结
  1. 线程安全:所有关键操作(如注册、移除、数据更新)限定在主线程。
  2. 生命周期感知:通过 LifecycleBoundObserver 自动管理观察者生命周期。
  3. 高效分发:基于版本控制和活跃状态避免冗余通知。
  4. 内存安全:自动清理 DESTROYED 状态的观察者,需手动处理 observeForever() 的移除。

LiveData 的设计平衡了功能性与安全性,适合在 Android 开发中实现响应式数据流。