LiveData源码分析
创始人
2024-02-15 03:06:41
0

先放整理流程图:

1.postValue调2次只触发1次?

postValue本质是把新值保存到LiveData的mPendingData成员变量里,版本号+1,把执行Runnable post到主线程,在主线程setValue。

多次调用会更新mPendingData的值,但Runnable已经post过了就不再post了。

2.粘性事件是怎么回事

参考文章开始的流程图,下面几种情况导致考虑调用回调(considerNotify):

  • setValue
  • postValue(最终调setValue)
  • 当生命周期状态变化时(observer通过装饰模式,被赋予了生命周期状态监听的能力)

considerNotify时:

  • 如果LifecycleOwner至少是START状态,则认为是活跃的
  • 如果observer的mLastVersion(默认为-1)大于新事件的版本号,则忽略

对于粘性事件,初始时设置了值,但是因为没有监听端,在setValue -> considerNotify时,值无法被消费,新注册了observer后,值才被消费。

3.可以在observer被回调时setValue?

可以。

分析见文章开始的流程图。

dispatchingValue方法虽然是单线程模型,但是做了对《在回调中setValue》的防护。

详细源码如下:

private void dispatchingValue(@Nullable ObserverWrapper initiator) {// 如果当前正在for循环中回调结果,则标记为“分发已刷新”状态,不再分发if (mDispatchingValue) {mDispatchInvalidated = true;return;}mDispatchingValue = true;do {mDispatchInvalidated = false;if (initiator != null) {considerNotify(initiator);initiator = null;} else {for (Iterator, ObserverWrapper>> iterator =mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {considerNotify(iterator.next().getValue());// 如果处于“分发已刷新”状态,说明值改变了,需要break并重新执行do-while语句// 重新对所有observer进行结果回调if (mDispatchInvalidated) {break;}}}} while (mDispatchInvalidated);mDispatchingValue = false;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...