[JetPack] LiveData源码解析

Jetpack——LiveData源码解析 阅读详情

1. 背景 官网LiveData

笔者在开发一款即时通讯和音视频应用时,发现需要花费很大的力量去处理系统组件之间的数据传递,稍微有点不注意,就会出现状态错乱不同步的问题,影响用户体验,也给系统稳定性带来了许多挑战。因此,在我们2.0版本的重构过程中,毅然决定引入LiveData,经过实践证明,其是一种优秀的解决方案,很适合处理此类问题,但也有一些细节需要注意,因此有了这篇文章,希望可以记录下来。

1.1 定义

  • 数据持有类
  • 感知组件生命周期
  • 数据能够被观察者所观察

1.2 使用 LiveData 的优势

  • 确保界面符合数据状态
  • 不会发生内存泄漏
  • 不会因 Activity 停止而导致崩溃
  • 不再需要手动处理生命周期
  • 数据始终保持最新状态
  • 适当的配置更改
  • 共享资源

2. 正文

2.1 使用 LiveData 步骤

2.1.1 创建 LiveData 实例以存储某种类型的数据。这通常在 ViewModel 类中完成。
        public class NameViewModel extends ViewModel {

        // Create a LiveData with a String
        private MutableLiveData<String> currentName;

        public MutableLiveData<String> getCurrentName() {
            if (currentName == null) {
                currentName = new MutableLiveData<String>();
            }
            return currentName;
        }

        // Rest of the ViewModel...
    }
2.1.2 创建可定义 onChanged() 方法的 Observer 对象,该方法可以控制当 LiveData 对象存储的数据更改时会发生什么。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中创建 Observer 对象。使用 observe() 方法将 Observer 对象附加到 LiveData 对象。observe() 方法会采用 LifecycleOwner 对象。这样会使 Observer 对象订阅 LiveData 对象,以使其收到有关更改的通知。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中附加 Observer 对象
    public class NameActivity extends AppCompatActivity {

        private NameViewModel model;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Other code to setup the activity...

            // Get the ViewModel.
            model = new ViewModelProvider(this).get(NameViewModel.class);

            // Create the observer which updates the UI.
            final Observer<String> nameObserver = new Observer<String>() {
                @Override
                public void onChanged(@Nullable final String newName) {
                    // Update the UI, in this case, a TextView.
                    nameTextView.setText(newName);
                }
            };

            // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
            model.getCurrentName().observe(this, nameObserver);
        }
    }
2.1.3 更新 LiveData 对象,LiveData 没有公开可用的方法来更新存储的数据。MutableLiveData 类将公开 setValue(T) 和 postValue(T) 方法,如果您需要修改存储在 LiveData 对象中的值,则必须使用这些方法。
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            String anotherName = "John Doe";
            model.getCurrentName().setValue(anotherName);
        }
    });

2.2 LiveData 代码分析

2.2.1 MutableLiveData.java(LiveData的一个派生类,由于LiveData并未提供给外部更新数据的接口,所以一般使用MutableLiveData来实例化LiveData)
package androidx.lifecycle;

/**
 * {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
 *
 * @param <T> The type of data hold by this instance
 */
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {

    /**
     * Creates a MutableLiveData initialized with the given {@code value}.
     *
     * @param value initial value
     */
    public MutableLiveData(T value) {
        super(value);
    }

    /**
     * Creates a MutableLiveData with no value assigned to it.
     */
    public MutableLiveData() {
        super();
    }

    @Override
    public void postValue(T value) {
        super.postValue(value);
    }

    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}
2.2.2 LiveData.observe()方法
    @MainThread // 标记该方法只允许在主线程运行,一般是在Activity/Service的onCreate方法中执行
     // 第一个参数 LifecycleOwner,表示的是一个具有生命周期的通用组件,如Activity/Service
     // 第二个参数 Observer,就是我们的观察者实例,当数据变化时会执行onChange方法
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        assertMainThread("observe"); // 主线程断言检测
        if (owner.getLifecycle().getCurrentState() == DESTROYED) { // 如果当前组件的生命周期是销毁,则立即返回
            // ignore
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); // 一个用于关联 组件和观察者 之间的对象
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing != null && !existing.isAttachedTo(owner)) { // 不允许同一个观察者观察不同的组件
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        if (existing != null) {
            return;
        }
        owner.getLifecycle().addObserver(wrapper); // 添加到组件的观察者队列
    }
2.2.3 注意事项:
我们看一段注释,如果你已经post一个任务给主线程,但还未来得及执行,此时你再多次调用postValue,则意味着最新的值会被post,后面的值会覆盖前面的值。这一点需要特别注意,笔者在开发的时候,由于在Service中根据网络状态来更新LiveData的值,但是发现Activity中部分值无法观察到,后来看了注释才焕然大悟。
/**
     * Posts a task to a main thread to set the given value. So if you have a following code
     * executed in the main thread:
     * <pre class="prettyprint">
     * liveData.postValue("a");
     * liveData.setValue("b");
     * </pre>
     * The value "b" would be set at first and later the main thread would override it with
     * the value "a".
     * <p>
     * If you called this method multiple times before a main thread executed a posted task, only
     * the last value would be dispatched.
     *
     * @param value The new value
     */
    protected void postValue(T value) {

3. 总结

未完待续,敬请期待
Android Jetpack架构组件之 LiveData(使用、源码篇) 1、前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。 Android Architecture组件是Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件: 带你领略Android Je... 阅读详情

相关推荐

Jetpack实战:Transformations在LiveData中的高级应用与源码解析

本文深入解析了Jetpack中Transformations工具类在LiveData数据流处理中的高级应用。重点剖析了map、switchMap和distinctUntilChanged三大核心方法的使用场景、实战技巧与源码实现,阐述了如何通过它们构建响应式数据链,实现数据转换、动态源切换与性能优化,从而编写出更清晰、健壮的Android架构代码。

weixin_29302047的博客 202

Android Jetpack LiveData源码解析

通过深入理解LiveData的源码实现,我们可以更好地在实际开发中使用它。合理利用生命周期感知特性:让LiveData自动管理数据更新,减少手动处理生命周期事件的复杂性。正确选择setValue和postValue:根据数据更新的场景和需求,选择合适的方法来更新LiveData中的数据。注意观察者的注册和解除注册时机:确保在Activity或Fragment的生命周期中正确管理观察者的注册和解除注册,避免内存泄漏。优化数据更新策略:合理使用粘性事件和异步更新,以优化应用性能和用户体验。

weixin_75207021的博客 1377

LiveData 源码解析与 Android Jetpack

总结起来,LiveData 是 Android Jetpack 组件库中一个强大的数据观察者类,它提供了一种响应式的数据更新机制,并与生命周期紧密集成,避免了常见的内存泄漏和空指针异常问题。这使得 LiveData 成为构建响应式界面的理想选择,它可以确保数据的更新与界面的状态一致,避免了内存泄漏和空指针异常等问题。另外,LiveData 还提供了与生命周期相关的方法,如 observe() 方法用于注册观察者,并实现生命周期感知,确保在合适的生命周期状态下触发数据更新。

UoJava的博客 125

Jetpack ——LiveData初识到源码解析(一)

上篇博客分享了下Lifecycle,使用的技术也就是:观察者模式+注解+反射。本篇博客继续学习Jetpack的LiveData,其实这个东西是一种可观察的数据存储类。 LiveData自己可以作为观察者,观察到数据变化,并回调给开发者。 它是可以监听到Activity(Fragment)生命周期的变化,并且在Activity处于活跃状态下,才发送时间通知开发者处理业务逻辑。 LiveData官网 这个LiveData不是数据,是数据存储类。 LiveData的使用 示例:一个按钮,一个TextView

lmq121210的博客 570

LiveData源码解析 -- Android Jetpack的概述和简单使用

LiveData是一种可观察的数据持有者,它具有生命周期感知能力,可以感知应用程序组件(如Activity、Fragment)的生命周期状态,并确保将数据的更新仅发送给处于活跃状态的观察者。LiveData是一种可观察的数据持有者,它具有生命周期感知能力,可以感知应用程序组件(如Activity、Fragment)的生命周期状态,并确保将数据的更新仅发送给处于活跃状态的观察者。避免内存泄漏:由于LiveData具有生命周期感知能力,它可以自动解除对已销毁的观察者的引用,从而避免潜在的内存泄漏问题。

UoJava的博客 102

Jetpack源码解析 - Android Jetpack

通过分析Jetpack中的Architecture组件的源代码,我们可以更好地理解它们的实现原理和工作方式,从而更好地应用它们来开发高质量的Android应用程序。综上所述,Jetpack是一个强大而灵活的组件库,提供了许多有用的工具和组件,帮助开发者简化Android应用程序的开发过程。通过分析Jetpack中的Architecture组件的源代码,我们可以更好地理解它们的实现原理和工作方式,从而更好地应用它们来开发高质量的Android应用程序。ViewModel是用于存储和管理与UI相关的数据的类。

UoJava的博客 254

Jetpack-LiveData源码解析

LiveData源码解析 源码版本:2.4.0 需先了解:Lifecycle 使用 监听值 liveData.observe(LifecycleOwner, Observer) liveData.observeForever(Observer) 设置值 liveData.setValue(value) liveData.postValue(value) 移除监听 liveData.removeObserver(Observer) liveData.removeObservers(

weixin_55362248的博客 729

分组背包问题(MCKP)三大算法对比:贪心、Dyer-Zemel和动态规划谁更强?

本文深入对比了分组背包问题(MCKP)的三大主流算法:贪心算法、Dyer-Zemel算法和动态规划。通过分析各自的原理、实现及性能表现,揭示了贪心算法速度快但非最优,动态规划精确但受限于规模,而Dyer-Zemel算法则在效率与最优性间取得了最佳平衡,是解决中等至大规模MCKP问题的首选方案。

vscode6remote的博客 226

Jetpack ---- LiveData源码解析

这篇博客参考了 程序亦非猿 和 Hankkin Jetpack ---- LiveData源码解析1. LiveData 的基本使用2. LiveData 的原理分析2.1 LiveData.observe()2.2 LifecycleBoundObserverObserverWrapper2.3 activeStateChanged(boolean)2.4 dispatchingValue(ObserverWrapper) 分析2.4.1 ObserverWrapper 不为 null 的情况2.4.2

aha_jasper的博客 703

k8s 100个高频面试题

以下是 100 个 Kubernetes(k8s)高频面试题及其答案,涵盖了 Kubernetes 的核心概念、架构、组件、工作原理以及实际应用。答案:Master 节点组件:API Server:提供 RESTful API 接口,用于与集群交互。etcd:分布式键值存储,用于存储集群的配置数据和状态信息。Controller Manager:运行各种控制器进程,负责维护集群的状态。Scheduler:负责将 Pod 调度到合适的节点上运行。Worker 节点组件:Kubelet:运行在每个节点上的代理,

wankll的专栏 2779

【转载】参数估计(Parameter Estimation):频率学派(最大似然估计MLE、最大后验估计MAP)与贝叶斯学派(贝叶斯估计BPE)

基础 频率学派与贝叶斯学派 http://www.douban.com/group/topic/16719644/ http://www.zhihu.com/question/20587681 最大似然估计(Maximum likelihood estimation,MLE) http://baike.baidu.com/view/1918804.htm http://baike.baidu.co

影 的专栏 3413

Android JetPack LiveData源码解析

作者:白瑞德 简介和使用 官方对LiveData的定义是:一种可观察的数据存储器类;具有以下优点: 采用观察者模式,无需在数据发生变化时更新界面便能确保界面符合数据状态; 具有生命周期感知能力,不需要手动处理生命周期,也不会因Activity停止而导致崩溃; 观察者绑定到了Lifecycle对象,会自动进行清理,不会发生内存泄露; 同一个观察者只能和一个Lifecycle绑定; 数据始终维持最新的状态,生命周期变为非活跃状态,它会在再次变为活跃状态时展示最新的数据(当Activity生命周期发生变化,.

weixin_55362248的博客 324

用Docker-Compose三节点部署生产级Doris集群:从配置文件到故障转移

本文详细介绍了如何使用Docker-Compose部署一个生产级的三节点Apache Doris集群。内容涵盖从核心架构理解、配置文件编写到集群初始化验证的全过程,并重点讲解了如何实现高可用、数据持久化、健康检查以及故障转移等生产级运维关键点,为中小团队提供了一种在容器化便利性与系统稳定性间取得平衡的可靠部署方案。

kkk56的博客 856

jetpack之LiveData源码解析(小篇幅)

参考文献: https://juejin.im/post/5c25753af265da61561f5335 这个还用得着抄袭么?很简单的好吧,如果理解了Lifecycle的话。如果没有看Lifecycle我感觉看了也没啥用吧!!! demo LiveDataSample(AAC)中案例多的一笔(以上参考地址也有),在此懒得写!!! 值得学习 真正让我们应该注意的是 观察者模式,传说前几年乃至现在都是非常火的一个模式,之后我这边就一撸到底,继续探底 Rxjava,爽个够!!! 源码小解(没办法实在不多,只能叫

foshengtang的博客 244

JetLinks社区版VS企业版:手把手教你用PostgreSQL+Redis搭建物联网中台(Win7实测)

本文详细对比了JetLinks社区版与企业版的核心差异,并提供了在Windows 7系统上,使用PostgreSQL和Redis搭建物联网中台的完整部署教程。文章深入解析了从环境准备、后端服务构建到前端部署的每一步,为开发者在资源有限环境下构建高性价比物联网平台提供了清晰的实战指南。

w1x2y3的博客 305

关于MII、RMII、GMII、RGMII、PHY、网络变压器、RJ45的硬件总结

文章目录前言一、网络传输结构及原理1.以太网的工作原理2.TCP/IP协议3.数据链路层(MAC)二、介质独立接口MII,RMII,GMII,RGMII1.MII(Media Independent interface)2.RMII(Reduced Media Independent Interface)3.GMII(Gigabit Medium Independent)4.RGMII(Reduced Gigabit Media Independent Interface)三、物理层芯片(PHY)二、使用步

weixin_44415816的博客 3万+

Jetpack之Livedata应用与源码解析

Jetpack之LiveData

知识共享,你我皆是知识的搬运工 600

深入解析Incapsula reese84的生成机制与绕过策略

本文深入解析了Incapsula reese84的生成机制与绕过策略。reese84是一种基于客户端JavaScript挑战的Web安全防护,通过动态算法收集浏览器指纹并生成令牌Cookie。文章详细拆解了其两步验证流程,并提供了使用无头浏览器、逆向JS模拟请求以及Token维护等实战绕过方法,帮助开发者和安全研究人员应对自动化访问拦截。

weixin_29256771的博客 443

Jetpack 源码解析—LiveData的使用及工作原理

code小生,一个专注 Android 领域的技术平台公众号回复 Android 加入我的安卓技术群作者:Hankkinn链接:https://juejin.im/pos...

code小生 579

麒麟V10安装图形化界面

在配置VNC时发现,原本麒麟V10系统最小化安装,导致无图形化界面,先需要对其进行安装。 首先确保无图形化界面,可以在终端输入startX命令查看是否报错。 安装介绍: 1、 安装图形化界面 yum grouplist //查看可用yum安装组 注:这里一般会有缺少包或者出现包不符合的问题 导入软件包分组信息文件xxxx-comps.xml arm: 将此文件传送到源服务器, 然后createrepo -g导入到arm的base目录和updates目录 createrepo -g e33dc

Pro_jhf的博客 8071

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android Jetpack LiveData 源码解析

是什么 LiveData 是具备生命周期的数据,当数据放生变化的时候,如果页面已经销毁,那么就不会回调给监听者。 有什么用? 当我们获取到网络请求的数据,如果页面已经销毁了,就不会调用更新Ui 的方法,防止发生空指针等异常。 比如常见的Fragment 里面的getContext()方法,当页面销毁了就会返回Null,如果我们调用了就会发生空指针。 怎么实现的? 类图: androidx.lifecycle.LiveData#observe @MainThread public void

男儿不展风云志,空有天生八尺躯 443

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

idea2020.2.3 maven只有lifecycle_从源码看 Jetpack(3)-LiveData源码解析

LiveData 是 Jetpack 的基础组件之一,在很多模块中都可以看到其身影。LiveData 可以和生命周期绑定,当 Lifecycle(例如 Activity、Fragment 等)处于活跃状态时才进行数据回调,并在 Lifecycle 处于无效状态(DESTROYED)时自动移除数据监听行为,从而避免常见的内存泄露和 NPE 问题本文就来介绍下 LiveData 的内部实现逻辑,从而让...

weixin_42651748的博客 300

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

4. Jetpack源码解析—LiveData的使用及工作原理

1. 背景 上一篇我们分析了Lifecycles组件的源码,本篇我们将继续分析LiveData组件 相关系列文章: 1. Jetpack源码解析—看完你就知道Navigation是什么了? 2. Jetpack源码解析—Navigation为什么切换Fragment会重绘? 3. Jetpack源码解析—用Lifecycles管理生命周期 2. 基础 2.1 简介 LiveData是一个可观察...

Hankkin的博客小园 1080

Jetpack系列 -- LiveData源码原理解析(解决黏性问题)

if (!} else {// 启用粘性事件// 次构造函数,必须调用主构造函数// 重写 增加hookif (!isStick) {// 不启用粘性事件Log.d(TAG, "不启动粘性事件")} else {Log.d(TAG, "启动粘性事件")// TODO 1.利用反射得到mLastVersion// 获取到LiveData类中的mObservers对象// 设置权限,私有修饰也可以访问// 获取到mObservers这个成员变量的对象。

sziitjin的博客 923

Android Jetpack系列--2.LiveData使用及源码解析

LiveData 定义 一种可观察的数据存储器类,直译为实时数据(是一个数据持有者,给源数据包装一层,源数据使用LiveData包装后,可以被observer观察,数据有更新时observer可感知); 具有生命周期感知能力,可确保 LiveData 仅更新处于活跃生命周期状态(STARTED、RESUMED)的应用组件观察者(observer); 特点 确保界面符合数据状态:当生命周期状态变化时,LiveData通知Observer,可以在observer中更新界面。 观察者可以在生命周期状态更改时

o118abcdef的博客 236
上一篇: Android Styling System 知识体系
艾特小王子
博客等级 码龄10年 6粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值