首先看初始化:
先看of里干了什么:
可以看到,初始化了一个AndroidViewModelFactory,接着初始化了一个ViewModelProvider,先看看AndroidViewModelFactory有什么重要的方法没有
记住这个create!因为这个是我们自定义的ViewModel初始化的地方!可以看到,就是拿到viewmodel的构造方法进行了初始化然后再看看get方法里干了什么
这里的create就是调用的上面截图的create方法,将viewmodel初始化并返回,而这个方法的第一行我们可以看到,它先是用mViewModelStore将我们的viewModel给缓存起来,下次再初始化的时候,如果有的话,就直接返回,否则,创建一个,并放入mViewModelStore中
不出所料,ViewModelStore里维护了一个hashMap
那么就清楚了,在使用livedata的时候,会初始化一个viewModelProvider的类,里面维护了一个viewmodel的hashmap,用来缓存已经初始化好的我们自定义的viewmodel
那么接下来再看一下observe里做了什么操作?
初始化了一个LifecycleBoundObserver,并放入mObservers这个成员变量,同时添加进该页面的监听回调中,mObservers一看就知道又是一个Map类,用来存储监听该值的所有页面
果然如此。。。
那么看一下LifecycleBoundObserver是什么
很简单,shouldBeActive用来判断是否还在可以监听回调的范围内(Started~DESTROYRED)
onStateChanged用来处理值变化后的回调,具体流程见:https://blog.youkuaiyun.com/Genius_sasuke/article/details/105818505
isAttachedTo判断该fragment或者activtiy是否已经监听了这个值的变化
detachObserver则取消该页面的监听
那么整个流程就是这样了:使用AndroidViewModelFactory将我们自定义的viewmodel初始化,然后将自定义的Observer放到livedata维护的一个map里面,等有值的变化的时候,通过dispatchingValue的方法通知各个页面。
引申:该模式被我们称为订阅者模式,那么订阅者模式到底跟观察者模式有什么样的区别呢?
答:依据我自己的理解,订阅者模式其实是两个观察者模式或者一个观察者模式跟工厂模式的结合,拿订报纸来说,原本我们直接从杂志社拿报纸,属于一级观察者模式(报社通知我们有新报纸),从杂志社拿报纸的人多了之后,杂志社就要专门成立一个部门来处理(代码显得臃肿),但是一旦有了报亭这个中间者,我们可以从报亭拿(不用关心是哪家报社产的),而杂志社印好了就往报亭送(不需要知道有多少人需要报纸),从而达到了解耦的目的。但是本质上,我们需要跟报亭订(一个观察者模式:报亭有了报纸就通知我们有报纸),报亭需要跟报社拿报纸(这里可以是报社通知报亭有新报纸--即另一个观察者模式,或者是报亭要的时候,报社及时印刷--即工厂模式)。
以上,有什么不对的地方,还望广大网友进行指正