• 源码层面理解 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: ");
        }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

  • 相关阅读:
    Android Studio实现内容丰富的旅游App
    ssm智慧养老服务平台毕业设计-附源码211709
    Java实现栈和队列
    Kotlin高仿微信-第21篇-个人信息-修改头像
    VScode SSH无法免密登录
    宏定义天坑记录
    绘图软件 OmniGraffle mac中文版特点说明
    黑马程序员 计算机网络(笔记)
    代码检查 pre-commit如何使用
    FFmpeg例子分析---音频解码decode_audio
  • 原文地址:https://blog.csdn.net/weixin_41618135/article/details/132877550