urlname
type
Post
password
SyncToConfluence
category
Android
date
Mar 8, 2023 20:35
slug
8cd246572452
icon
Button
catalog
summary
tags
Android
Jetpack
源码解析
cover
Status
BusyTime
Status 1
status
Published

介绍

什么是 LiveData?

Android Jetpack LiveData 是一种具有生命周期感知能力的可观察数据持有类,用于在应用程序组件之间共享数据

LiveData 的相关实现原理是什么?

生命周期感知

因为在为 LiveData 创建 Observer 时,要传入一个 lifecycle 参数,LiveData 就是根据这个,从而具有了生命周期感知的能力
  • LiveData 能够感知 Activity、Fragment、Service 等组件的生命周期状态,能够自动管理订阅者的生命周期。
  • 当订阅者的生命周期处于 STARTED 或者 RESUMED 状态时,LiveData 会通知订阅者数据变化;
  • 当订阅者的生命周期处于 DESTROYED 状态时,LiveData 会自动清理订阅者,避免内存泄漏。

观察者模式

LiveData 中,要获取数据,只能通过注册 Observer 来监听数据变化,所有,LiveData 的实现机制,其实是基于观察者模式的
  • LiveData 持有一个观察者列表,当 LiveData 的数据变化时,会通知观察者列表中所有的观察者。
  • LiveData 通过 setValue()postValue() 方法提供了设置数据和通知数据变化的接口,其中 postValue() 方法可以在后台线程中通知数据变化。

缓存最新值

  • LiveData 在有活跃观察者时,会将 最新 的数据值保存下来,当有新的观察者注册时,LiveData 会将最新的数据值发送给新的观察者,确保了新的观察者能够及时获取到最新的数据。
  • 这样也会带来问题,那就是数据重放,即当新的观察者注册时,会把上次发的最后一次的历史数据传递给当前注册的观察者

线程安全

LiveData 保证了数据的线程安全。
  • LiveDatasetValue() 方法只能在主线程中调用,如果在子线程中调用会抛出异常。
  • postValue() 方法可以在后台线程中调用,LiveData 会在主线程中通知数据变化,确保了数据的线程安全。

LiveData 相关方法

注册和移除观察者

方法名
描述
observe()
注册一个观察者,以便在数据变化时得到通知。
removeObserver()
移除一个观察者,停止接收该观察者的通知。
observeForever()
注册一个永久观察者,以便在数据变化时得到通知。永久观察者不会受到生命周期的影响,即使没有任何活跃的观察者,永久观察者也会收到数据变化的通知。
removeObservers()
移除所有观察者,停止接收所有观察者的通知。

设置和获取数据值

方法名
描述
setValue()
设置 LiveData 的数据值。setValue() 方法只能在主线程中调用。LiveData 会通知所有观察者数据变化。
postValue()
设置 LiveData 的数据值,并在后台线程中通知所有观察者数据变化。postValue() 方法可以在后台线程中调用。
getValue()
获取 LiveData 的当前数据值。

判断和获取状态

方法名
描述
hasActiveObservers()
判断 LiveData 是否有活跃的观察者,即观察者的生命周期处于 STARTED 或者 RESUMED 状态。
hasObservers()
判断 LiveData 是否有观察者,即是否有任何注册的观察者。

其他方法

方法名
描述
getVersion()
获取 LiveData 的当前版本号。版本号是 LiveData 内部用来标识数据变化的一个值,每次数据变化时,LiveData 的版本号会自动加 1。

源码解析

observe 注册监听器

  • 具体看代码解析

LifecycleBoundObserver 包装类

用于将 Observer(观察者)与 LifecycleOwner(生命周期所有者)绑定,以便在观察者所在的生命周期处于 STARTED 或者 RESUMED 状态时收到数据变化的通知
  • 具体看代码解析

dispatchingValue 方法

considerNotify 方法

推荐/参考

Java HashMap源码解析RecyclerView 缓存机制
Loading...