源码层面理解 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 的值修改过,那么会通知所有注册的观察者。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值