文章目录
前言
LivedData作为Jetpack的一部分,在很多地方可以看到的他的身影,比如Room直接支持LiveData,Android架构规范中也有推荐使用,因此了解整个实现原理,更有助于我们在开发中灵活的使用。
使用LiveData的优势:
1. 确保界面符合数据状态
LiveData 遵循观察者模式。当生命周期状态发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。观察者可以在每次发生更改时更新界面,而不是在每次应用数据发生更改时更新界面
2.不会发生内存泄漏
观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。
3.不会因 Activity 停止而导致崩溃
如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。
4.不再需要手动处理生命周期
界面组件只是观察相关数据,不会停止或恢复观察。LiveData
将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化
5.数据始终保持最新状态
如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。
6.适当的配置更改
如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment,它会立即接收最新的可用数据。
7.共享资源
您可以使用单一实例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象
为了解如何实现以上优势,我们需要自己手写一遍源码,这样所有的疑惑解答
源码实现
一、 实现可观察的数据存储器
可观察的数据存储器是它的基本功能,我们的第一步就是实现它;可观察的数据存储器,顾名思义:第一,可以存储数据;第二:数据发生变化时可以通知观察者。
第一步,定义观察者,当数据发生变化的时候,可通过该观察者进行回调处理。
public interface Observer<T> {
/**
* Called when the data is changed.
* @param t The new data
*/
void onChanged(T t);
}
第二步,定义数据存储类
public class LiveData<T> {
static final Object NOT_SET = new Object();
//数据存储
private volatile Object mData = NOT_SET;
static final int START_VERSION = -1;
private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
new SafeIterableMap<>();
/**
* 注册观察者
* @param observer 该observer可监听所有的事件,观察者一直处于活跃状态,只要数据发生变化,就能收到事件回调
*/
public void observeForever(Observer<? super T> observer) {
AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
//同一个observer存储一次
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if(existing != null){
return;
}
//新注册的观察者,默认设置为active状态,从而能及时接收当前最新数据
wrapper.activeStateChanged(true);
}
//对Observer进行包装处理
private abstract class ObserverWrapper {
final Observer<? super T> mObserver;
boolean mActive;
int mLastVersion = START_VERSION;
ObserverWrapper(Observer<? super T> observer) {