【Jetpack】LiveData学习笔记

原文链接:Android官方架构组件LiveData: 观察者模式领域二三事本文是 《Android Jetpack 官方架构组件 - 掘金

LiveData用法

public class MainActivity extends AppCompatActivity{
    //1.实例化一个LiveData
    public MutableLiveData<String> data = new MutableLiveData<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //2.观察LiveData
        data.observe(this, new Observer<String>() {
            @Override
            public void onChanged(String str) {
                //4.观测到数据变更,可以拿到改变后的数据
            }
        });
    }
    
    @Override
    protected void onResume(){
        //3.在此处改变数据
        data.setValue("XXXX");
    }
}

也可以将其的值应用于某一布局,通过改变变量值实时更新布局。在xml文件中通过“@{变量}”的方式使用

LiveData实际上就像一个 容器, 本文中它存储了一个String类型的引用,每当这个容器内 String的数据发生变化,我们都能在回调函数中进行对应的处理。

对于观察者来说,它并不关心观察对象 数据是如何过来的,而只关心数据过来后 进行怎样的处理。这也就是说,事件发射的上游接收事件的下游 互不干涉,大幅降低了互相持有的依赖关系所带来的强耦合性。

LiveData如何避免内存泄漏

LiveData,当它被我们的Activity订阅观察,这之后Activity如果finish()掉,LiveData本身会自动“清理”以避免内存泄漏。

根据断言可知,执行LiveData.observer()方法时 必须处于主线程。

1.首先我们在调用LiveData.observer()方法时,传递的第一个参数Activity实际被向上抽象成为了 LifecycleOwner,第二个参数Obserser实际就是我们的观察后的回调。

2.方法内部实际上将我们传入的2个参数包装成了一个新的 LifecycleBoundObserver对象,它实现了 Lifecycle 组件中的LifecycleObserver接口:

3.在第三步中,对于一个可观察的LiveData来讲,存在多个观察者同时订阅观察的情况,因此考虑到这一点,为每一个LiveData配置了一个Map存储所有的观察者。

4.将第2步包装生成的对象交给我们传入的 Activity,让它在不同的生命周期事件中去逐一通知其所有的观察者,当然也包含了我们的LiveData

LiveData活跃状态

LiveData内部存储的每一个LifecycleBoundObserver本身都有shouldBeActive的状态:

只有在onStart()生命周期后,onPause()之前的状态变更,才会处于活跃状态,只有处于活跃状态,回调才会被执行。

既然LiveData已经能够实现在onDestroy()的生命周期时自动解除订阅,为什么还要多此一举设置一个Active的状态呢?

更多时候,新的Activity运行在栈顶,旧的Activity就会运行在 background——这时旧的Activity会执行对应的onPause()onStop()方法,我们当然不会关心运行在后台的Activity所观察的LiveData对象(即使数据更新了,我们也无从进行对应UI的更新操作),因此LiveData进入 InActive(待定、非活跃)状态,return并且不去执行对应的回调方法,是 非常缜密的优秀设计

如果希望Activity在后台依旧可以响应数据变更,LiveData提供了observerForever()方法,在这种情况下,它能够响应到任何生命周期中数据的变更事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值