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);。
如何解决数据倒灌和为什么谷歌要设计数据倒灌呢?下次写
网友评论