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保证了数据的线程安全。
LiveData的setValue()方法只能在主线程中调用,如果在子线程中调用会抛出异常。
- 而
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 方法
推荐/参考
- Author:CoderWdd
- URL:https://www.wuinsights.top//article/8cd246572452
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts
