上一篇我们分析了Lifecycle的工作流程(不了解Lifecycle的可以先看一下Lifecycle源码解析)。这篇咱们来分析一下LiveData。
它能干什么?
LiveData是一个数据持有者,在数据发生改变后根据被观察者(Activity/Fragment)的生命周期,通知观察者。
角色分配;我们一般是在Activity/Fragment去观察数据的变化,被观察者显然就是数据了,它们通过LiveData的observe方法产生关联:
我们看到传如一个LifecycleOwner和一个Observer,上一篇我们说过Activity/Fragment的父类或间接父类已经实现了LifecycleOwner ,而Observer就是一个回掉,里边只有一个onChanged方法:
我们在添加监观察者的时候一般会创建匿名内部类去创建Observer。
我们回来继续看LiveData的observe方法:
将传入的2个参数封装成LifecycleBoundObserver对象,并存起来;最后一行通过LifecycleOwner来添加被观察者的生命周期,这里的被观察者是Activity/Fragment,还记得我们上一篇分析的Lifecycle分发状态时的场景吗?
当生命周期发生改变,分发状态的时候一样走这里的流程。
如果到这里你感觉有点懵还是请移步先了解一下Lifecycle(Lifecycle源码解析)。
至此关于LiveData生命周期的流程就到这,其实主要还是基于Lifecycle。
接下来我们就可以去看数据发生变化以后的流程了;当我们从服务端请求到数据时,一般会调用setValue或postValue方法,它们的区别是setValue是在主线程执行的,postValue则是在子线程;
我们先来看一下setValue:
我们看关键的最后一行,继续跟踪:
上边在调用时传入的是null,那么走到do,while的else,这里是遍历所有的observer,调用considerNotify:
在最后一行就调用了我们的observer的onChanged方法,流程走完。
别忘了还有一个postValue方法:
最后一行代码,传入了一个Runnable
其实到这里可能有的兄弟已经想到了,没错:
最后将Runnable传到DefaultTastExecutor的postToMainThread,createAsync方法非常简单,将主线程的looper传入:
根据不同版本创建了一个Handler,把传递过来的Runnable通过Handlerpost到主线程。
到这里LiveData的正题流程就走完了。
除Lifecycle以外的流程其实并不复杂,流程中会根据生命周期的状态去判断是否需要通知观察,如果当前不处于活动状态的话,是不会继续后面的操作的。
本篇内容结束。