源码层面理解 LiveData 各种特性的实现原理

0 前言

  LiveData 是 Jetpack 提供的响应式编程组件,可以包含任何类型的数据,并且在数据发生改变时通知观察者。
LiveData 具有以下特点:

  1. 当 LiveData 数据发生改变时,会触发观察者的 onChanged 方法。
  2. 使用 LiveData.observe 注册观察者,不用在宿主生命周期的 onDestroy 反注册观察者。
  3. 支持黏性分发,LiveData 数据改变后,再注册观察者,也会触发观察者 onChanged 方法。

1 LiveData 基本使用

在 Activity 中 将观察者注册到 LiveData 中

MutableLiveData mutableLiveData = new MutableLiveData();
mutableLiveData.observe(this, new Observer() {
    @Override
    public void onChanged(Object o) {
        Log.d(TAG, "onChanged: ");
    }
});

LiveData 的使用会涉及三个重要的对象。LifecycleRegistry、LiveData 本身,Observer 观察者。
在这里插入图片描述

1 触发观察者的 onChanged 方法。

  在注册观察者时,会将观察者包装后,放到一个 map 中。
在这里插入图片描述
  LiveData 调用 setValue 值后,setValue -> dispatchingValue -> considerNotify -> observer.onChanged,遍历保存观察者的 map,调用观察者的 onChanged 方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 反注册

  在向 LiveData 中注册观察者时,还传入观察者所在宿主 LifecycleOwner 这个参数,我们这里的宿主是 Activity。owner.getLifecycle().addObserver(wrapper) 这行代码,将观察者包装后注册到 Activity 的 LifecycleRegistry 中。所以包装后的观察者注册到 LiveData 和 Acitivity 的 LifecycleRegistry 中。
在这里插入图片描述
  Activity 继承了 FragmentActivity,FragmentActivity 中有 LifecycleRegistry 这个变量,当 Activity 生命周期发生变化时,LifecycleRegistry 会通知包装后的观察者。
  当 Activity 摧毁时,LifecycleRegistry 通知包装后的观察者。最终是调用观察者的 onStateChanged 方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  我们看下包装后的观察者 LifecycleBoundObserver 的 onStateChanged 方法。最终调用的是 removeObserver,这个方法里面将观察者和 LiveData 以及 宿主进行反注册。因此不用我们手动反注册。
在这里插入图片描述
在这里插入图片描述

3 黏性分发

  我们知道数据修改是触发观察者的 onChanged 方法。当 LiveData 使用 observe 注册观察者时,会调用观察者的 onChanged 方法。但是准确地说,是 observe 中观察者所在宿主(即 activity )注册了观察者,从而触发观察者调用 onChanged 方法。
在这里插入图片描述
   Activity.getLifecycle() 返回的是一个 LifecycleRegistry 类。不断向下读代码 sync() -> forwardPass() -> observer.dispatchEvent -> mLifecycleObserver.onStateChanged。最终调用的还是观察者的 onStateChanged。
在这里插入图片描述
在这里插入图片描述
  返回 LiveData 查看观察者的包装类。不断往下读 activeStateChanged -> dispatchingValue -> considerNotify
在这里插入图片描述在这里插入图片描述
  最终可以看到我们注册观察者,最终会调用 consideNotify。在 considerNotify 中,我们的 LiveData 有个版本号,如果 LiveData 的值修改过,那么会通知所有注册的观察者。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LiveData 是用于在 Android 应用程序中观察数据的一个组件。LiveData 是一个可观察的数据持有者类,它具有生命周期感知能力,因此它会自动管理它与 Activity 和 Fragment 生命周期的关系,从而可以避免内存泄漏和崩溃。 LiveData 的一个重要特性是它可以通知观察者数据已更改。当 LiveData 的值发生更改时,它会自动通知所有观察者。这意味着您无需手动更新 UI 或执行其他操作以反映数据更改。LiveData 还支持数据转换和过滤,因此您可以将原始数据转换为 UI 可以直接使用的格式。 LiveData 使用观察者模式进行数据监听,您可以使用 `observe()` 方法将观察者添加到 LiveData 实例中,该方法需要传入一个 LifecycleOwner 和一个 Observer 对象。LifecycleOwner 表示 LiveData 与哪个组件的生命周期绑定,通常是 Activity 或 Fragment。Observer 对象定义了当 LiveData 的值更改时要执行的操作。 下面是一个简单的示例,演示如何使用 LiveData 监听数据更改: ``` // 创建一个 LiveData 实例 val myLiveData = MutableLiveData<String>() // 将观察者添加到 LiveData 实例中 myLiveData.observe(this, Observer { newValue -> // 在这里更新 UI 或执行其他操作 textView.text = newValue }) // 更改 LiveData 的值 myLiveData.value = "Hello World" ``` 在上面的示例中,我们创建了一个名为 `myLiveData` 的 LiveData 实例,并将其与当前组件的生命周期绑定。我们还将一个 Observer 对象传递给 `observe()` 方法,以便在 LiveData 的值更改时执行操作。当我们调用 `myLiveData.value = "Hello World"` 时,LiveData 会自动通知所有观察者,以便更新 UI 或执行其他操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值