android livedata原理,Jetpack真香系列之LiveData原理解析

LiveData是什么?

首先贴上官方链接

从字面意思上来看,这个是一个活跃,有生命的数据。那为何活跃?活跃与否从何判断?

先来看这么一个类LifecycleOwner

a4f81c2095cab340d0480e07c7c23892.png

他是一个生命周期的持有者,做为一个android开发来说,这个对大家来说都不陌生,我们所熟知的Activity,Fragment,他们是有典型的生命周期特征,oncreate,onstart,onpause,onstop,ondestory等等,那他们里面的实现是怎样的呢?我这里稍微介绍一下。

59b49e9104354692ed003f957f0162bf.png

906ba6c93f65471e0b1c34d3649799ca.png

4fe3d7c93c894438e1b2b3c92c2c090a.png

从图中可以看到ComponentActivity实现了LifecycleOwner的接口,返回了一个mLifecycleRegistry对象

a1062c203a7666cd5508ea8e466b9214.png

这个LifecycleRegistry是继承自一个lifecycle的抽象类,然后作为owner的activity持有这个lifecycle

那具体这个是怎么运作的呢?

a5fe8fc4799b6a2192d3cc1ff2bceae5.png

在ComponentActivity的oncreate里添加了一个ReportFragment,这个ReportFragment做的事很简单

cfb02ce02aef5cdc800a135844bc4810.png

在他的生命周期里,去做dispatch,分发的操作

b25f4a2b9667af7cb5475414290eb9d9.png

很显然,这个ReportFragment拿到当前activity的Lifecycle,也就是上文的mLifecycleRegistry对象去做一个分发的动作

handleLifecycleEvent

44642cf7ddd7aabafb22c1d188a20648.png

0aa9158153a65aeae659a2930da94e9d.png

这里最终其实走forward或者backward,backward类似一个生命周期的状态控制,一个是状态的前进,一个是状态的后退,有兴趣的可以自己debug研究一下,类似fragment里的有个movetostate方法,然后就走到最后一步 observer.dispatchEvent(lifecycleOwner, event),像观察这个生命组件的观察者分发我当前的event。

前面介绍的差不多,来看看livedata的构造

971b76a179a42fd3390b8bed23c66906.png

一个抽象类,最多用的可能是MutableLiveData的这个子类,提供了两个对外的方法postvaule和setvalue,再来看看livedata的用法

b38f0970bb4a8c2db5a0108b5fc572fa.png

LiveData怎么用?

首先新建一个livedata的对象,这里用了MutableLiveData,然后observe方法传入了两个参数 一个是owner,另一个是Observer

d071f91976ba194f336f65a1cc5bf908.png

来看看他的方法,

@MainThread

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer super T> observer) {

//要在主线程操作,不然抛异常

assertMainThread("observe");

如果当前owner已经销毁,就不会添加

if (owner.getLifecycle().getCurrentState() == DESTROYED) {

// ignore

return;

}

//这里把observer进行了一层包装,类似rxjava用操作符把下游的observer传入到操作符里面的observer,对结果进行处理,判断后在分发给我们传入的observer

LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);

//把我们添加的observer都放到mObservers这个SafeIterableMap里

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和包装后的observer关联起来。

owner.getLifecycle().addObserver(wrapper);

}

复制代码

那这个LifecycleBoundObserver的包装起了什么作用呢?

9983e2572a7525710db1eca32a8d6311.png

//shouldBeActive()帮我们判断owner的生命周期,大于STARTED时返回true

7ccf8cfffb9905885b3f315005364f55.png

76173e3b69c68044533bb558aec18c6a.png

onStateChanged,在前文owner向observer分发event的最后其实是会调用这个方法,可以理解为任何有生命周期变动,都会触发这个方法,

首先判断owner的生命周期的安全性,然后触发activeStateChanged,而我们刚刚保存observer的集合mObservers就派上用场了,这里会对这里所有的观察者进行一个notify,从owner生命周期的变化到observer的感知,其实这里有很多的判断,比如生命周期是否安全,是否已经触发过(防止重复调用)和version的比对,每次触发修改value值(set or post)的调用都会使内部mVersion自增,并最后赋值给最新的mLastVersion,当校验完成后才会调用到我们的onchange方法,这是作为一个值分发的操作。

而当owner的当前生命周期为DESTROYED的时候,自动会把从mObservers里移除掉,这样就算有一个后台线程持有了这个livedata的引用去进行一个setvalue的操作但是我们的observer回调里是不会受到这个信息的,这样我们可以大胆放心的onchange里去做一些ui上面的操作而不必担心界面销毁所引发各种奇奇怪怪的问题~

出此之外,如果没有lifecycleowner,也可以用observerforever来监听livedata数据的变化,observerforever与observer不同的是他不会自动的remove这个observer,除非你手动调用removeobserver

c4f8e06454a6b7d21a833fb01752f41c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值