Android JetPack学习笔记之LiveData

本文是关于Android JetPack中LiveData的学习笔记,探讨了LiveData的类图、源码分析,特别是观察者模式的实现,以及如何在生命周期内安全地观察数据变化。重点关注了LiveData的observe和observeForever方法,setValue与postValue的使用区别,以及组件状态改变时的影响。同时,提到了LiveData在ViewModel中的应用,强调了防止内存泄漏的最佳实践。
摘要由CSDN通过智能技术生成

前言

Jetpack 是 Android 软件组件的集合,使您可以更轻松地开发出色的 Android 应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。
最近有空边学习边把学习笔记做了。巩固知识,输入输出,强化学习,如有不对望指出,感谢
(以下是对官方代码文档的翻译和自己的部分见解)

如果引用JetPack库

    implementation 'android.arch.lifecycle:extensions:1.1.1'

LiveData

LiveData是一个可以在给定Lifecycle内观察到的数据持有者类。

这就意味着一个(lifecycleOwner)生命周期持有者添加了一个
观察者(observer),并且这个观察者(observer)只有当成对的LifecycleOwner处于活动状态时,才会通知观察者(observer)有关打包数据的修改。如果LifecycleOwner的状态Lifecycle.State== STARTED 或者 Lifecycle.State ==RESUMED的话,该LifecycleOwner是处于活动的。观察者通过observeforever(observer)被视为始终处于活动状态,因此将始终收到修改的通知。对于这些observers,你需要手动调用removeObserver来移除监听。

1.一个Lifecycle已订阅了一个Observer,如果Lifecycle的状态转变成Lifecycle.State==DESTROYED时那么Observer将自动被移除。这可以Activity/Fragment
帮助他们安全的观察LiveData并且不用担心内存泄漏,当他们销毁时将立即取消订阅
2. 另外,LiveData有onActive()(活动中)和onInactive()(不活动)方法用来获得Observer的活动状态从0到1发生改变。这允许LiveData在不需要一些Observers积极观察时释放一些繁重的资源。
3.这个类被设计用于持有ViewModel的单独数据字段,但也可以用于你的应用/解耦方式 中不同models的数据分享的
4. ViewModel只负责管理UI的数据,它不应该直接访问你的视图层次和持有你的Activity/Fragment的引用。(例如:不把视图对象或者Activity/Fragment的Context作为对象传入到ViewModel中。避免内存泄漏)

LiveData类图分析

在这里插入图片描述

LiveData源码分析

LiveData涉及到三个时序过程
1.Fragment/Activity通过LiveData.observe()方法添加观察者。
2.当调用LiveData.setValue/postValue方法时,触发onChange方法。通知观察者数据更新
3.当Fragment/Activity的活动状态改变时也会触发onChange方法

1.添加观察者

添加观察者有2中方式observe和observeForever

observe
@MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
   
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
   
            // 判断所属观察持有者(owner)的生命周期状态是否销毁
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        //将owner和observer观察者加入SafeIterableMap中
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing != null && !existing.isAttachedTo(owner)) {
   
            //确保同一个观察者绑定同一个lifecycle
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
            
        }
        if (existing != null) <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值