源码层面理解 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 观察者。
源码层面理解 LiveData 各种特性的实现原理_第1张图片

1 触发观察者的 onChanged 方法。

  在注册观察者时,会将观察者包装后,放到一个 map 中。
源码层面理解 LiveData 各种特性的实现原理_第2张图片
  LiveData 调用 setValue 值后,setValue -> dispatchingValue -> considerNotify -> observer.onChanged,遍历保存观察者的 map,调用观察者的 onChanged 方法。
源码层面理解 LiveData 各种特性的实现原理_第3张图片
源码层面理解 LiveData 各种特性的实现原理_第4张图片
源码层面理解 LiveData 各种特性的实现原理_第5张图片

2 反注册

  在向 LiveData 中注册观察者时,还传入观察者所在宿主 LifecycleOwner 这个参数,我们这里的宿主是 Activity。owner.getLifecycle().addObserver(wrapper) 这行代码,将观察者包装后注册到 Activity 的 LifecycleRegistry 中。所以包装后的观察者注册到 LiveData 和 Acitivity 的 LifecycleRegistry 中。
源码层面理解 LiveData 各种特性的实现原理_第6张图片
  Activity 继承了 FragmentActivity,FragmentActivity 中有 LifecycleRegistry 这个变量,当 Activity 生命周期发生变化时,LifecycleRegistry 会通知包装后的观察者。
  当 Activity 摧毁时,LifecycleRegistry 通知包装后的观察者。最终是调用观察者的 onStateChanged 方法。
源码层面理解 LiveData 各种特性的实现原理_第7张图片
源码层面理解 LiveData 各种特性的实现原理_第8张图片
源码层面理解 LiveData 各种特性的实现原理_第9张图片
源码层面理解 LiveData 各种特性的实现原理_第10张图片
源码层面理解 LiveData 各种特性的实现原理_第11张图片
  我们看下包装后的观察者 LifecycleBoundObserver 的 onStateChanged 方法。最终调用的是 removeObserver,这个方法里面将观察者和 LiveData 以及 宿主进行反注册。因此不用我们手动反注册。
源码层面理解 LiveData 各种特性的实现原理_第12张图片
源码层面理解 LiveData 各种特性的实现原理_第13张图片

3 黏性分发

  我们知道数据修改是触发观察者的 onChanged 方法。当 LiveData 使用 observe 注册观察者时,会调用观察者的 onChanged 方法。但是准确地说,是 observe 中观察者所在宿主(即 activity )注册了观察者,从而触发观察者调用 onChanged 方法。
源码层面理解 LiveData 各种特性的实现原理_第14张图片
   Activity.getLifecycle() 返回的是一个 LifecycleRegistry 类。不断向下读代码 sync() -> forwardPass() -> observer.dispatchEvent -> mLifecycleObserver.onStateChanged。最终调用的还是观察者的 onStateChanged。
源码层面理解 LiveData 各种特性的实现原理_第15张图片
源码层面理解 LiveData 各种特性的实现原理_第16张图片
  返回 LiveData 查看观察者的包装类。不断往下读 activeStateChanged -> dispatchingValue -> considerNotify
源码层面理解 LiveData 各种特性的实现原理_第17张图片源码层面理解 LiveData 各种特性的实现原理_第18张图片
  最终可以看到我们注册观察者,最终会调用 consideNotify。在 considerNotify 中,我们的 LiveData 有个版本号,如果 LiveData 的值修改过,那么会通知所有注册的观察者。
源码层面理解 LiveData 各种特性的实现原理_第19张图片

你可能感兴趣的:(Jetpack,java,android,开发语言)