https://zhuanlan.zhihu.com/p/33206893
LiveData 内部通过观察者模式实现了事件的分发,同时内部又绑定了lifecycle,所以只有当observer处于starr或者resume状态,才能分发事件给观察者
ViewModel,ViewModelProvider
ViewModelProvider内部通过一个hashmap<key,ViewModel>用来存储数据,这个数据的存活周期由当前绑定的Activity或者Fragment决定,
ViewModel配合LiveData一起使用,避免了生命周期的管控(liveData的作用),同时实现了数据的保存。
更新:
1 主动setValue,LiveData 通过 setValue(当前线程),postValue(主线程)来实现更新,调用dispatchValue,mVersion ++,如果当前Fragment 或者 Activity的状态 >= onStart(),则回调当前Observer的 onChange,
2 当 Activity或者Fragment生命周期 >= onStart时,会遍历所有的Observer,如果Observer mVersion > mLastVersion,则更新
LIVEDATA的问题:
问题1: observeForever, 开始注册时,立即收到更新消息, 另外ObserveForever因为没有生命周期管控,所以会存在内存泄漏
问题2: observe(LifeCycleOwner,Observer) :在fragment 或 Activity 活跃时,也就是( >= onStart),会调用dispatchValue,此时可能还没有数据
解决办法:
问题1: 自定义ObserverWrapper,封装一层,在onChange的时候,判断当前线程对战中,如果有observeForever,则不处理
问题2: 注册时,反射LiveData,获取Observers,然后get到当前的ObserverWrapper,发射修改mLastVersion = mVersion,即可
美团 liveDataBus: https://tech.meituan.com/2018/07/26/android-livedatabus.html
DataBinding 原理:https://www.jianshu.com/p/4be20cc58f17 https://www.wuhaojie.top/2018/10/11/AndroidDataBindingComprehension/