美文网首页
LiveData源码分析(二)

LiveData源码分析(二)

作者: 在岁月中远行 | 来源:发表于2022-11-28 00:04 被阅读0次

    1 LiveData对生命周期的响应

    当一个界面对一个LiveData对象进行了监听,当界面处于非活跃状态时,如果我们更新了LiveData的数据,那么界面并不会响应变化,当界面重新回到活跃状态时,刚刚更新的LiveData数据会马上进行响应。

    为什么界面重新回到活跃状态时,比如可交互状态onResume,刚刚更新的LiveData数据会马上进行响应呢?

    这句代码会让wrapper和owner的生命周期进行绑定,也就是说,owner生命周期变化,wrapper就能在onStateChanged方法中监听到。

    411行:判断当前状态是否大于STARTED状态,如果是RESUME,那时肯定大于的,因为枚举值定义在后面。

    418行:如果是DESTORY,那么直接return,不执行后面语句了。

    425行 调用activeStateChanged方法

    467行:如果是活跃状态,那么就执行下面语句,dispatchingValue方法。

    最后就会走onChanged回调了。

    2 LiveData的自动解绑

    LiveData能大大降低内存泄露的概率,主要是owner销毁了,它会自动解绑。下面我们来看看怎么实现的。

    我们知道当owner生命周期处于DESTORY时候,会执行LiveData类中的removeObserver(mObserver);方法

    245行:将observer从Map集合中移除。

    249行:removed.detachObserver();

     将owner和LifecycleBoundObserver解绑。因为LifecycleBoundObserver实现了

    LifecycleEventObserver,而LifecycleEventObserver又继承 了LifecycleObserver

    250行:removed.activeStateChanged(false);

    会调用这个方法把活跃的数量减1

    3 LIveData里的线程安全

    当在多个线程要发送数据更新调用postValue,在这里用到synchronized (object) {}对象锁来保证mPendingData = value;同一个对象多线程同一时刻postValue方法时,只有一个线程执行mPendingData = value;执行这句。(不同对象保证不了应该)

    代码中还采用了volatile保证线程之间的可见性。

    4 数据倒灌的现象代码分析:

    当我们先发送数据例如setValue,然后再开始进行mLiveData.observe(this){}再执行这句代码进行绑定监听,那么之前发送的值会立马回调给监听者。

    当我们没有通过传参的构造方法创建了LiveData对象,那么mVersion=-1,然后执行setValue方法。

    那么此时mVersion=0了。

    这时mLastVersion=-1<0,所以会回调observer.mObserver.onChanged((T) mData);。

    如何解决数据倒灌和为什么谷歌要设计数据倒灌呢?下次写

    相关文章

      网友评论

          本文标题:LiveData源码分析(二)

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