1.MutableLiveDataä¸LiveDataåºå«ï¼å¯åä¸ä¸å¯å
2.LiveData 面试题库、源码解答、源码源码分析
3.LiveDataBus
4.源码解读最详细的源码LiveData分析,从未如此丝滑
MutableLiveDataä¸LiveDataåºå«ï¼å¯åä¸ä¸å¯å
ä¹åçå°å¾å¤ä¸æå客说ï¼
ççææ¯ä¸å¤´é¾æ°´ï¼äºæ¯å»StackOverflowæäºä¸ï¼ é«èµçæ¡ å´ä¸»è¦å¨è¯´ï¼
å¦ææ们è¿ä¸æ¥ççMutableLiveData.javaä» æå¤è¡çæºç ï¼å°±ä¼åç°ç¡®å®åè 说ç对ï¼MutableLiveDataä» ä» æ¯æ´é²åºæ¥äºsetValueåpostValueæ¹æ³ï¼
æåï¼å¨Androidå®æ¹ç åºç¨æ¶ææå éï¼ä¹åæ¶ç¨å°äºäºè ã
å®æ¯å¨ViewModelå é¨ä½¿ç¨äºprivateçMutableLiveDataå®ä¾ï¼ä½å¯¹å¤æ´é²çæ¯LiveDataç±»åï¼ææçç解ï¼ç®çåºè¯¥æ¯é²æ¢è¯¯ä¿®æ¹å§ã
LiveData 面试题库、源码解答、源码源码分析
LivaData 的源码网站源码编程语言面试题库与解答、源码分析 作者:唐子玄1. LiveData 如何感知生命周期的源码变化?
LiveData 在常规的观察者模式上附加了条件,若生命周期未达标,源码即使数据发生变化也不通知观察者。源码这通过 Lifecycle 实现,源码Lifecycle 是源码生命周期对应的类,提供了添加/移除生命周期观察者的源码方法,并定义了全部生命周期的源码状态及对应事件。要观察生命周期,源码lstm keras 源码需要实现 LifecycleEventObserver 接口,源码并注册给 Lifecycle。除了生命周期观察者外,还有数据观察者,数据观察者会与 LifecycleOwner 进行绑定。2. LiveData 是如何避免内存泄漏的?
内存泄漏是因为长生命周期的对象持有了短生命周期对象。在观察 LiveData 数据的代码中,Observer 作为界面的匿名内部类,它会持有界面的引用,同时 Observer 被 LiveData 持有,LivData 被 ViewModel 持有,而 ViewModel 的生命周期比 Activity 长。最终的编译 android 源码持有链导致内存泄漏。LiveData 帮助避免内存泄漏,在内部 Observer 会被包装成 LifecycleBoundObserver,这实现了生命周期感知能力,同时它还持有了数据观察者,具备了数据观察能力。3. LiveData 是粘性的吗?若是,它是怎么做到的?
是的,LiveData 是粘性的。数据是持久的,意味着它不会因被消费而消失。当 LiveData 值更新时,会通知所有观察者。这一过程通过一个 Map 结构保存了所有观察者,swiper 轮播源码并通过遍历 Map 并逐个调用 considerNotify() 方法实现。观察者会被包装在 LifecycleBoundObserver 中,它具备了生命周期感知能力,同时持有了数据观察者。当组件生命周期发生变化时,会尝试将最新值分发给该数据观察者。4. 粘性的 LiveData 会造成什么问题?怎么解决?
粘性的 LiveData 可能导致数据重复消费或消费逻辑混乱。解决方案包括使用带消费记录的值、带有最新版本号的观察者、SingleLiveEvent 等。其中,使用 SingleLiveEvent 可以根据数据的分类(暂态数据或非暂态数据)来选择性地利用或避免粘性。5. 什么情况下 LiveData 会丢失数据?
在高频数据更新的趣头条 源码场景下使用 LiveData.postValue() 时,如果在这次调用和下次调用之间再次调用 postValue(),则会导致数据丢失,因为值先被缓存,再向主线程抛出分发值的任务。这与 LiveData 的设计和更新机制有关。6. 在 Fragment 中使用 LiveData 需注意些什么?
在 Fragment 中使用 LiveData 时,应当使用 viewLifecycleOwner 而非 this。避免因生命周期不一致导致的额外订阅者问题。使用 SingleLiveEvent 可以解决数据重复消费问题。7. 如何变换 LiveData 数据及注意事项?
androidx.lifecycle.Transformations 提供了变换 LiveData 数据的方法,如 map()。需要注意数据变换操作应避免阻塞主线程,可使用 CoroutineLiveData 来异步化数据变换。LiveDataBus
LiveDataBusæ¯åºäºLiveDataå®ç°ç类似EventBusçæ¶æ¯éä¿¡æ¡æ¶ï¼å®æ¯åºäºLiveDataå®ç°çï¼å®å ¨å¯ä»¥ä»£æ¿EventBusï¼RxBusï¼LiveDataBusç主è¦æ¯åºäºåå¸è®¢é 设计模å¼ï¼åå¸è®¢é 模å¼å®ä¹äºä¸ç§ âä¸å¯¹å¤â çå ³ç³»ï¼åè§å¯è 模å¼æ¯å®å ¨ä¸åç两个设计模å¼ï¼
ä¸é¢è¯¦ç»ä»ç»æ ¸å¿ç±»LiveData
LiveDataæ¯ä¸ä¸ªå¯ä»¥è¢«è§å¯çæ°æ®holderï¼å¹¶ä¸å¯ä»¥èªå¨æç¥æ§ä»¶ççå½å¨æï¼ä¸ä¼åçå åæ³æ¼ï¼
LiveDataéè¦ä¸ä¸ªè§å¯è 对象ï¼å½LiveDataçå¼åçæ¹åæ¶ï¼è§å¯è ä¼å¯è§å°è¿ä¸ªæ¹åï¼
使ç¨livedata注åè§å¯è çå¬
使ç¨livedataåéæ¶æ¯ç»è§å¯è
LiveDataå ¶å®å°±æ¯ä¸ä¸ªåæ¾æ°æ®çholderï¼ç±»ä¼¼ViewHolderçholderï¼åæ¾å¨LiveDataéçæ°æ®ä¼æ¥æLiveDataçç¹æ§ï¼
LiveDataæ¯Android Architecture Componentsçä¸ä¸ªç±»ï¼è¿ä¸ªç±»æ¯è°·æå¨Google I/O åå¸ä¸å¥å¸®å©å¼åè 解å³Androidæ¶æ设计çæ¹æ¡ãè¿ä¸ªç±»æåä¸ªæ ¸å¿ï¼åç»ä¼ä¸ä¸ä»ç»ï¼
ç¨ç¬¬ä¸ä»£LiveDataBus订é
åéæ¶æ¯
è³äºè¯´ä»æ¯ç¬¬ä¸ä»£busï¼è¯´æè¯å®æé®é¢ï¼é®é¢å°±æ¯å¨postæè setä¸ä¸ªvalueåï¼åªè¦å¨ä¸ä¸ªfrag/actéobserveäºï¼æ 论ç»ä»¶æ¯å¦å¯å¨ï¼é½ä¼æ¶å°valueï¼å³å½å¨act1ä¸postäºï¼å¨act2ä¸observeï¼ä½æ¯postçæ¶åact2没æè¿è¡ï¼å½å¯å¨act2ï¼æ¶å°äºvalueãæ¶å°äºè®¢é åçæ¶æ¯
éè¿æ¥çLiveDataçæºç åç°setValueï¼ï¼å¼å§ï¼ä¾æ¬¡è°ç¨äº
dispatchValue()-> considerNotify()-> observer.onChanged()
postValue()ä¼è°ç¨setValueï¼ï¼æ以åçï¼
è¿å°±è§£éäºä¸ºä»ä¹æ们å¯ä»¥å¨observerä¸æ¶å°postæ¥çvalueï¼ä¸ºä»ä¹act2ä¸è¿è¡ä¹å¯ä»¥æ¶å°valueï¼
æ们注æå°å½observer.mLastVersion >= mVersionçæ¶åä¼ç´æ¥returnï¼ä¸è°ç¨onChangedä»è解å³ä¸é¢çé®é¢ã
æ们éè¦æ¿å°mLastVersionï¼å°±éè¦æ¿å°observer对象ï¼é¡ºçæºç åç°observer对象åå¨mObserversçmapä¸ï¼æ们èªå®ä¹ä¸ä¸ªmutableLiveDataï¼æ¹åä»çobserveï¼ï¼ï¼å¨observeï¼ï¼ä¸ï¼éè¿åå°æ¿å°mObservers对象ï¼ä»èæ¿å°observer.mLastVersionï¼å°mVersionèµå¼ç»ä»ï¼
hookçä½ç¨ç¸å½äº å¨observeï¼ï¼è°ç¨åæ§è¡observer.mLastVersion = mVersion; 让considerNotifyï¼ï¼ç´æ¥returnï¼å¯æ¯æ们å¦ä½æ¶å°è®¢é åçpostå¢ï¼å 为åªæ订é çæ¶åæä¼hookï¼å¨hookåï¼æ们è°ç¨postï¼ï¼ï¼ä¼mVersion++ï¼æ以å¨å¤æ if (observer.mLastVersion >= mVersion) çæ¶åå°±åä¼æ¯falseäºï¼
源码解读最详细的LiveData分析,从未如此丝滑
本文深入解析LiveData在Android开发中的实现机制及用法,内容涵盖LiveData的生命周期感知、观察者注册、事件回调机制、数据更新以及解决粘性事件问题。通过分析LiveData的源码,以期读者能够深入理解LiveData的运作原理,从而在实际开发中灵活运用。
首先,LiveData是一种数据存储类,与传统的可观察类相比,具有生命周期感知能力。这意味着LiveData只会更新处于活跃生命周期状态的组件观察者,确保了数据的实时性和安全性。其感知能力基于LifecycleOwner接口,使得活动组件能够安心观察LiveData,无需担心组件生命周期变化导致的数据泄露。
在注册观察者时,LiveData内部通过LifecycleBoundObserver进行封装,确保只有处于活跃状态的组件才能成功注册。当组件进入DESTROYED状态时,观察者会自动移除,从而实现自动取消注册,避免了额外的代码实现。
当组件状态发生改变时,LiveData会通过Lifecycle的onStateChanged方法通知其内部的LifecycleBoundObserver,从而触发观察者回调。观察者在被移除或组件状态改变为DESTROYED时,不会收到任何通知。这确保了数据的实时性和组件的资源管理。
对于数据更新,LiveData提供postValue和setValue方法。setValue直接在主线程执行,而postValue则在主线程执行后调用setValue,确保数据更新的同步性。这些方法最终都会触发观察者回调,实现数据的实时更新。
观察者永久订阅(observeForever)机制则确保了即使观察者在组件销毁后被重新创建,也能接收到数据更新。通过AlwaysActiveObserver类实现,该类不依赖于组件的生命周期状态,确保了观察者状态的始终活跃。
在处理粘性事件时,LiveData通过在考虑通知方法中进行版本判断,确保只在观察者版本更新时发送数据。当新观察者订阅时,其版本尚未被初始化,导致旧值发送,这是粘性事件发生的根本原因。解决这一问题,需要确保观察者版本的正确性,避免不必要的数据发送。
综上,LiveData的源码解析涵盖了其核心机制、注册与取消注册流程、事件回调机制、数据更新方式以及解决粘性事件的方法。通过深入理解LiveData的工作原理,开发者能够在实际项目中高效地管理数据更新和组件生命周期,实现更加流畅和安全的用户体验。