Android架构组件-LiveData实现原理分析

本文详细分析了Android架构组件LiveData的工作原理,包括确保界面与数据同步、防止内存泄漏、处理生命周期变化等方面的优势。通过源码实现,解释了LiveData如何观察数据存储并通知观察者,以及如何感知应用组件的生命周期变化。此外,还讨论了LiveData如何在配置更改后保持数据最新状态,并介绍了其在实际开发中的基础使用方法。
摘要由CSDN通过智能技术生成

前言

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) {
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值