美文网首页
LiveData源码分析

LiveData源码分析

作者: 在岁月中远行 | 来源:发表于2022-11-26 01:57 被阅读0次

LiveData是一个具有感知生命周期的类,如Activity,Fragment,Service。只要和LiveData进行了绑定,LiveData就能感知到它们的生命周期。

那么,LiveData有什么好处呢?

1 监听与其绑定的界面的生命周期,因此用LiveData我们就不需要手动管理它的生命周期了。

2 组件能及时响应LiveData的数据变化,组件总能拿到LiveData的最新数据,当然被绑定的组件响应LiveData是有一定前提的,那就是LiveData数据发生变化且组件处于活跃状态。

(也就是说,LiveData数据即使发生了变化,也不一定响应onChanged函数,因为它必须要求LiveData数据所在的界面处于活跃状态,才会响应onChanged函数)。

3 生命周期自动解绑,因为其能够在组件销毁的时候自动解绑,大大降低了内存泄露的概率。

首先我们来看下怎么简单使用的

源码分析:下面我们进入源码来看看LiveData原理。

observe方法: LiveData的与组件的绑定方法开始看了,所以我们来看看LiveData的observe方法。

191行:保证方法执行在主线程。这点可以借鉴到我们自己写代码里或者使用@MainThread

192行:如果owner的生命周期为DESTORY,那么直接return

196行:将外部传进去的observer对象封装成一个LifecycleBoundObserver对象

它是继承自ObserverWrapper然后实现了LifecycleEventObserver接口

LifecycleEventObserver又实现了LifecycleObserver接口,那么可以这么说

LifecycleBoundObserver wrapper =new LifecycleBoundObserver(owner, observer);方法得到的wrapper实际上就是一个LifecycleObserver。

197行:ObserverWrapper existing =mObservers.putIfAbsent(observer, wrapper); 将observer和wrapper存放到map中去

将observer作为键,wrapper作为值存放到mObservers中去,wrapper作为值存放到mObservers中,并且会返回一个ObserverWrapper对象。

mObservers是一个由链表实现的支持键值对存储的数据结构SafeIterableMap,同时它支持在遍历的过程中删除任意元素,我们可以暂时把它认为类似HashMap功能的集合。

202行:当existing不为空时,则直接返回return了,那么再看看什么时候返回return

当观察者observer已经在mObservers这个列表中,并且observe已经有另一个所有者owner,就不会为null。

主要是保证同一个livedata的同一个observer只能跟一个lifecycleOwner绑定。否则会抛异常。throw new IllegalArgumentException("Cannot add the same observer"+" with different lifecycles");

205行:调用了owner.getLifecycle().addObserver(wrapper);方法,让wrapper和owner的生命周期进行了绑定。

也就是说,observer此时就可以监听到owner对应的界面的生命周期的变化了。

setValue方法

304行:@MainThread注解,说明这个方法只能在主线程使用

307行:mVersion变量加1,mVersion表示的数据版本,就是用来标记数据是否发生变化的了,

308行:进行赋值将value赋值给全局变量mData

309行:调用dispatchingValue(null)方法,

有个do while循环,由于initator为Null,所以走else方法,里面又有个for循环,这个for循环就是遍历拿到ObserverWrapper实例,,然后调用considerNotify方法。进行处理。

接着往下看considerNotify方法:

117行:如果observer对象不是活跃状态,直接return。

这里可以得出一个结论:即使数据更新了,但如果界面不处于活跃状态,也不会立即对数据更新做出响应。

129行:如果mLastVersion大于等于mVersion,会把mVersion的值赋值给observer.mLastVersion否则就return掉。

133行 程序走到这行来了,就说明数据是最新的数据,就可以执行obserer的onChanged方法把mData回调出去了。

postValue方法:

288行:外部传进来的value会赋值给mPendingData,方法最后会调用postToMainThread方法,这方法顾名思义就是将runnable发布到主线程去处理,

这方法很好理解。主要看runable执行的方法体:

88行:在run方法内部定义了Object类型的newValue变量,然后加锁将mPendingData赋值给newValue变量,其实也就是这个postVaue里面的参数value

93行 最后调用了setValue方法。

下篇继续分析其他方法。

相关文章

网友评论

      本文标题:LiveData源码分析

      本文链接:https://www.haomeiwen.com/subject/lxbqfdtx.html