LifecycRegistry
public class LifecycleRegistry extends Lifecycle {
 /**
- Custom list that keeps observers and can handle removals / additions during traversal.
- Invariant: at any moment of time for observer1 & observer2:
- if addition_order(observer1) < addition_order(observer2), then
- state(observer1) >= state(observer2),
 */
 private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap<>();
 private State mState;
 private final WeakReference mLifecycleOwner;
public LifecycleRegistry(@NonNull LifecycleOwner provider) {
 mLifecycleOwner = new WeakReference<>(provider);
 mState = INITIALIZED;
 }
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
 State next = getStateAfter(event);
 moveToState(next);
 }
private void moveToState(State next) {
 if (mState == next) {
 return;
 }
 mState = next;
 …
 sync();
 …
 }
 …
 }
跟着源码可以定位到Lifecycle的实现类LifecycRegistry中,它主要是封装了对Lifecycle.Event的操作,包括了Lifecycle.Event与Lifecycle.State的同步,以及Lifecycle.State变化后通知观察者。
先来看handleLifecycleEnvent的实现,通过传进来的event获取一个state枚举值,具体的实现代码如下:
static State getStateAfter(Event event) {
 switch(event) {
 case ON_CREATE:
 case ON_STOP:
 return State.CREATED;
 case ON_START:
 case ON_PAUSE:
 return State.STARTED;
 case ON_RESUME:
 return State.RESUMED;
 case ON_DESTROY:
 return State.DESTROYED;
 case ON_ANY:
 default:
 throw new IllegalArgumentException("Unexpected event value " + event);
 }
 }
官网中有一张图用来解释Event和State的对应关系

getStateAfter()方法既是获取Event事件之后的状态,可以从图中的箭头方向可知具体的状态值,比如ON_START和ON_PAUSE的箭头都指向了STARTED状态,也就是这俩个事件后Lifecycle处于STARTED状态。
回到handleLifecycleEvent()方法,获取新状态后,就调用了moveToState()方法,该方法主要是判断新状态与当前状态相比是否发生改变,如果已改变,则调用sync()同步方法继续处理。
在进一步跟踪方法调用前,不妨先看看LifecycleRegistry有哪些属性,除了上面提到的mState来表示当前Lifecycle的状态外,还有一个比较特殊和重要的属性是mObserverMap。
/**
- Custom list that keeps observers and can handle removals / additions during traversal.
- Invariant: at any moment of time for observer1 & observer2:
- if addition_order(observer1) < addition_order(observer2), then
- state(observer1) >= state(observer2),
 */
 private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap<>();
该属性可看作是一个自定义的Map,是一个可遍历的集合,也就是说其中的元素是有序的,封装了监听者LifecycleObserver和监听者的封装ObserverWithState之间的映射关系,根据注释可以知道,在遍历操作其中的监听者时,会保证其中监听者的状态是从大到小排序的。
监听者的封装ObserverWithState则是维护了每一个监听者和其状态,该状态主要是为了给调用事件分发前的判断,另外,在分发Event事件后会同步更新自己的状态。
static class ObserverWithState {
 State mState;
 LifecycleEventObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
 mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
 mState = initialState;
 }
void dispatchEvent(LifecycleOwner owner, Event event) {
 State newState = getStateAfter(event);
 mState = min(mState, newState);
 mLifecycleObserver.onStateChanged(owner, event);
 mState = newState;
 }
 }
接下来继续跟踪方法调用,来看看sync()做了哪些处理。
private void sync() {
 LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
 if (lifecycleOwner == null) {
 throw new IllegalStateException(“LifecycleOwner of this LifecycleRegistry is already”
- “garbage collected. It is too late to change lifecycle state.”);
 }
 while (!isSynced()) {
 mNewEventOccurred = false;
 // no need to check eldest for nullability, because isSynced does it for us.
 if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
 backwardPass(lifecycleOwner);
 }
 Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
 if (!mNewEventOccurred && newest != null
 && mState.compareTo(newest.getValue().mState) > 0) {
 forwardPass(lifecycleOwner);
 }
 }
 mNewEventOccurred = false;
 }
该方法通过比较当前状态和mObserverMap元素的枚举值来确定是否分发事件,由于mObserverMap里元素是按状态的大到小排序的,所以这里只需要拿第一位和最后一位元素的状态与当前状态比较,就可以判断是否需要分发事件,以及是分发降级事件,还是分发升级事件。再具体一点说,如果mObserverMap里最大状态比当前状态大,那就需要调用backwardPass(),遍历mObserverMap,同步其中每一个observer状态的同时,分发降级事件,反之,如果mObserverMap里最小状态比当前状态小,就调用forwardPass()分发升级事件。
private void backwardPass(LifecycleOwner lifecycleOwner) {
 Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
 mObserverMap.descendingIterator();
 while (descendingIterator.hasNext() && !mNewEventOccurred) {
 Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
 ObserverWithState observer = entry.getValue();
 while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
 && mObserverMap.contains(entry.getKey()))) {
 Event event = downEvent(observer.mState);
 pushParentState(getStateAfter(event));
 observer.dispatchEvent(lifecycleOwner, event);
 popParentState();
 }
 }
 }
private void forwardPass(LifecycleOwner lifecycleOwner) {
 Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
 mObserverMap.iteratorWithAdditions();
 while (ascendingIterator.hasNext() && !mNewEventOccurred) {
 Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
 ObserverWithState observer = entry.getValue();
 while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
 && mObserverMap.contains(entry.getKey()))) {
 pushParentState(observer.mState);
 observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
 popParentState();
 }
 }
 }
backwardPass()和forwardPass()类似,分别是以降序和升序的方式遍历mObserverMap中的observer,再以内部循环通过downEvent()和upEvent()获取下一步的Event事件,并通过observer.dispatchEvent()分发事件和同步状态。直到mObserverMap中的每一个observer的状态都与当前状态一致为止。
private static Event downEvent(State state) {
 switch (state) {
 case INITIALIZED:
 throw new IllegalArgumentException();
 case CREATED:
 return ON_DESTROY;
 case STARTED:
 return ON_STOP;
 case RESUMED:
 return ON_PAUSE;
 case DESTROYED:
 throw new IllegalArgumentException();
 }
 throw new IllegalArgumentException("Unexpected state value " + state);
 }
private static Event upEvent(State state) {
 switch (state) {
 case INITIALIZED:
 case DESTROYED:
 return ON_CREATE;
 case CREATED:
 return ON_START;
 case STARTED:
 return ON_RESUME;
 case RESUMED:
 throw new IllegalArgumentException();
 }
 throw new IllegalArgumentException("Unexpected state value " + state);
 }
downEvent()和upEvent()的实现同样可以从官网给的Event与State的关系图中找到对应关系。下面再放一下这张图。

downEvent()降级事件就是状态向后箭头对应的事件,而upEvent()升级事件则是状态向前箭头对应的事件。比如说CREATED的升级事件是ON_START,通过ON_START,CREATED升级为STARTED。CREATED的降级事件是ON_DESTROY,通过ON_DESTROY,CREATED降级为DESTROY。
方法调用流转到这里,已经分析完Event从创建到分发的处理过程,接下来就来解决刚开始提出的第三个问题。
如何分发到特定的LifecycleObserver实现
通过ObserverWithState,可以发现dispatchEvent()方法是直接调用mLifecycleObserver接口的onStateChanged()进行的事件分发,那么mLifecycleObserver的具体实现是怎样的呢?通过 mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer)可以知道静态方法Lifecycling.lifecycleEventObserver()对传入的监听者进行了处理,接下来就来看看该方法是怎么实现的。
static LifecycleEventObserver lifecycleEventObserver(Object object) {
 boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
 boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
 if (isLifecycleEventObserver && isFullLifecycleObserver) {
 return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
 (LifecycleEventObserver) object);
 }
 if (isFullLifecycleObserver) {
 return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
 }
if (isLifecycleEventObserver) {
 return (LifecycleEventObserver) object;
 }
final Class<?> klass = object.getClass();
 int type = getObserverConstructorType(klass);
 if (type == GENERATED_CALLBACK) {
 List<Constructor<? extends GeneratedAdapter>> constructors =
 sClassToAdapters.get(klass);
 if (constructors.size() == 1) {
 GeneratedAdapter generatedAdapter = createGeneratedAdapter(
 constructors.get(0), object);
 return new SingleGeneratedAdapterObserver(generatedAdapter);
 }
 GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
 for (int i = 0; i < constructors.size(); i++) {
 adapters[i] = createGeneratedAdapter(constructors.get(i), object);
 }
 return new CompositeGeneratedAdaptersObserver(adapters);
 }
 return new ReflectiveGenericLifecycleObserver(object);
 }
该方法主要将传入的监听者进行封装,方便生命周期事件的转发,这个封装分成了三种方式,每一种可看作是后面的优化,第一种性能最高,传入的监听者直接是接口的实例,但由于生命周期回调方法比较多,接口的实例默认是实现了所有方法,而大部分情况并不需要监听所有生命周期,所以这一部分在java8接口默认方法的支持下比较好用。第二种是判断传入的监听者是不是已用注解解析器处理,生成了对应的封装类,如果项目中配置了注解解析,那么在编译过程中就会生成相应的类型,相对应于运行时反射解析方法的方式,编译时通过注解生成类型在代码执行时性能更高。第三种就是运行时反射解析的处理了,限于篇幅,这里就只追踪一下第三种方式的处理过程。
直接定位到ReflectiveGenericLifecycleObserver类。
class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
 private final Object mWrapped;
 private final CallbackInfo mInfo;
ReflectiveGenericLifecycleObserver(Object wrapped) {
 mWrapped = wrapped;
 mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
 }
@Override
 public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) {
 mInfo.invokeCallbacks(source, event, mWrapped);
 }
 }
该类的实现很简单,在创建实例时,使用getInfo()方法,通过传入监听者的class,构造出CallbackInfo实例。在接受到生命周期回调后,方法流转到CallbackInfo实例的invokeCallbacks()方法上。
CallbackInfo getInfo(Class<?> klass) {
 CallbackInfo existing = mCallbackMap.get(klass);
 if (existing != null) {
 return existing;
 }
 existing = createInfo(klass, null);
 return existing;
 }
getInfo()查看是否已有缓存,如果没有,就调用createInfo()方法解析class对象。
private CallbackInfo createInfo(Class<?> klass, @Nullable Method[] declaredMethods) {
 Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
 …
 Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
 for (Method method : methods) {
 OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
 if (annotation == null) {
 continue;
 }
 hasLifecycleMethods = true;
 Class<?>[] params = method.getParameterTypes();
 int callType = CALL_TYPE_NO_ARG;
 if (params.length > 0) {
 callType = CALL_TYPE_PROVIDER;
 if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
 throw new IllegalArgumentException(
 “invalid parameter type. Must be one and instanceof LifecycleOwner”);
 }
 }
 Lifecycle.Event event = annotation.value();
if (params.length > 1) {
 callType = CALL_TYPE_PROVIDER_WITH_EVENT;
 if (!params[1].isAssignableFrom(Lifecycle.Event.class)) {
 throw new IllegalArgumentException(
 “invalid parameter type. second arg must be an event”);
 }
 if (event != Lifecycle.Event.ON_ANY) {
 throw new IllegalArgumentException(
 “Second arg is supported only for ON_ANY value”);
 }
 }
 if (params.length > 2) {
 throw new IllegalArgumentException(“cannot have more than 2 params”);
 }
 MethodReference methodReference = new MethodReference(callType, method);
 verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
 }
 CallbackInfo info = new CallbackInfo(handlerToEvent);
 mCallbackMap.put(klass, info);
 mHasLifecycleMethods.put(klass, hasLifecycleMethods);
 return info;
 }
createInfo()方法主要是对类中的方法的遍历处理,这里只接受三种类型的方法,使用callType区分,第一种CALL_TYPE_NO_ARG是没有参数的方法,第二种CALL_TYPE_PROVIDER是一个参数的方法,参数类型为LifecycleOwner本身,第三种CALL_TYPE_PROVIDER_WITH_EVENT是二个参数的方法,第一个参数类型同CALL_TYPE_PROVIDER一样,第二个参数则是ON_ANY枚举值的Event。
每次遍历会将方法用MethodReference封装起来,并使用hanlderToEvent建立MethodReference与event的映射关系,注意这时候一个方法只能有一种Event事件类型相对应,最后以hanlderToEvent这个map创建CallbackInfo对象。
static class CallbackInfo {
 final Map<Lifecycle.Event, List> mEventToHandlers;
 final Map<MethodReference, Lifecycle.Event> mHandlerToEvent;
CallbackInfo(Map<MethodReference, Lifecycle.Event> handlerToEvent) {
 mHandlerToEvent = handlerToEvent;
 mEventToHandlers = new HashMap<>();
 for (Map.Entry<MethodReference, Lifecycle.Event> entry : handlerToEvent.entrySet()) {
 Lifecycle.Event event = entry.getValue();
 List methodReferences = mEventToHandlers.get(event);
 if (methodReferences == null) {
 methodReferences = new ArrayList<>();
 mEventToHandlers.put(event, methodReferences);
 }
 methodReferences.add(entry.getKey());
 }
 }
@SuppressWarnings(“ConstantConditions”)
 void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
 invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
 invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
 target);
 }
private static void invokeMethodsForEvent(List handlers,
 LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
 if (handlers != null) {
 for (int i = handlers.size() - 1; i >= 0; i–) {
 handlers.get(i).invokeCallback(source, event, mWrapped);
 }
 }
 }
 }
CallbakcInfo在创建时,会解析hanlderToEvent,把一个MethodReference对应一个event的关系,转化为一个event对应多个MethodReference,并存入到mEventToHandlers中。这样在被调用invokeCallbacks()方法时,只需要从mEventToHandlers中取出对应的MethodReference,就可以回调监听者了。
static final class MethodReference {
 final int mCallType;
 final Method mMethod;
MethodReference(int callType, Method method) {
 mCallType = callType;
 mMethod = method;
 mMethod.setAccessible(true);
 }
void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
 //noinspection TryWithIdenticalCatches
 try {
 switch (mCallType) {
 case CALL_TYPE_NO_ARG:
 mMethod.invoke(target);
 break;
 case CALL_TYPE_PROVIDER:
 mMethod.invoke(target, source);
 break;
 case CALL_TYPE_PROVIDER_WITH_EVENT:
 mMethod.invoke(target, source, event);
 break;
 }
 } catch (InvocationTargetException e) {
 throw new RuntimeException(“Failed to call observer method”, e.getCause());
 } catch (IllegalAccessException e) {
 throw new RuntimeException(e);
 }
 }
 …
 }
invokeCallback()就是根据callType对mMethod进行反射调用,最终执行到Lifecycling.lifecycleEventObserver()传入的监听器的方法实现中。
到此,Lifecycle的基本流程已经分析完了。接下来,可以使用类图对Lifecycle的处理流程做下总结。
类关系图
该图使用simpleUML工具生成

用最初的使用代码来解释一下这个类图。
lifecycleOwner.getLifecycle().addObserver(new MyObserver());
首先,通过LifecycleOwner拿到Lifecycle示例,LifecycleOwner是提供获取Lifecycle实例的接口,一般ComponentActvitiy和Fragment会实现这个接口,这个新旧代码有些差别,使用时需要区分。
然后,Lifecycle实例一般具体类型是LifecycleRegistry,它里面使用State管理当前的生命周期状态,同时每个监听者LifecycleObserver也都有一个State,表示监听者当前的状态,生命周期事件Event发生后,会在LifecycleRegistry内与State发生互相转化,再使用这个转化后最新的State,与所有监听者的State比较,到达完整无误地通知监听者生命周期事件的目的。
最后,监听者注册进Lifecycle时,一般情况下会使用ReflectiveGenericLifecycleObserver封装,ReflectiveGenericLifecycleObserver本身也是LifecycleObserver接口的实现,它还封装了从传入监听者类中解析的CallbackInfo,在被通知生命周期事件时,会使用CallbackInfo反射调用到用户声明的接口方法实现上。
自底向上方法总结
自底向上的方式分析源码主要在于分析前问题的提出,上面应用了软件过程中的输入、处理和输出这三个角度提出问题,算是比较通用的一种方式。问题提出后,便可以以解决问题为目的分析源码,不至于在茫茫源码中迷失了方向。解决完问题,紧接着把源码的主要流程梳理一遍,做出总结,即可以加深对原理的理解。
02自顶向下
自顶向下分析源码与自底向上在思路上正好相反,需要先绘制出组件的类关系图,然后抽出主要方法,进一步解析方法,从而掌握实现细节,它适合于在对源码组件有一个整体上的了解前提下进行,可以深刻掌握组件的原理特性。接下来就使用该方法总结出LiveData的特性。
首先还是以一个示例开始:
MutableLiveData liveString = new MutableLiveData<>();
 liveString.observe(mOwner, new Observer() {
 @Override
 public void onChanged(@Nullable final String s) {
 Log.d(TAG, “onChanged() called with: s = [” + s + “]”);
 }
 });
liveString.setValue(“LiveData使用案例”);
该例子包含了使用LIveData的基本三部分:定义、注册监听者、更新数据。可以同样以软件过程的输入、处理和输出三个角度为切入点进行分析。处了定义外,监听者相关的操作可以看作是输出,比如注册、回调、注销。更新数据则可以看作是输入,而处理则是在LiveData的内部完成。
类关系图

LiveData的类关系图并不复杂,它只有5个类,除了示例中已经出现的有Observer和MutableLiveData,而主要类LiveData则包含和处理的主要逻辑,LiveData的内部类ObserverWrapper和LifecycleBoundObserver则提供了封装Observer和Lifecycle生命周期管理的能力。这里也可以看出LiveData依赖Livecycle的关系。
可以从类图中抽出需要分析的方法,回到输入、处理和输出的角度,对应的就是数据更新、数据流转和监听者处理三类方法。
输入-数据更新:postValue()、setValue()、onStateChanged()
处理-数据流转:activeStateChanged()、dispatchingValue()、considerNotify()
输出-监听者处理:observe()、removeObserver()、onChanged()
接下来,可以使用在源码方法间快速跳转的方式,手动定位并列出相应处理链。

从该图中可以看出触发数据通知的两个处理链:
1. 注册监听者后,可以接收到Lifecycle事件,这时候可能会移除监听者,也可能触发了数据通知
2. 手动postValue或setValue触发数据通知
接下来,便以这两个任务链的顺序,对每个方法进行分析。
observer()注册监听者
@MainThread
 public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
 assertMainThread(“observe”);
 if (owner.getLifecycle().getCurrentState() == DESTROYED) {
 // ignore
 return;
 }
 LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
 ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
 if (existing != null && !existing.isAttachedTo(owner)) {
 throw new IllegalArgumentException(“Cannot add the same observer”
- " with different lifecycles");
 }
 if (existing != null) {
 return;
 }
 owner.getLifecycle().addObserver(wrapper);
 }
该方法就是把Lifecycle持有对象LifecycleOwner和一个监听者observer传进来,实现这个监听者在这个生命周期作用域下对LiveData的数据进行监听。这里主要的处理是对observer使用Lifecycle的监听者LifecycleBoundObserver进行了封装,并存入管理所有监听者的mObservers中。这里除了过滤避免重复外,还对监听者对应的LifecycleOwner进行了判断,防止一个监听者处于多个Lifecycle作用域进而导致混乱的情况发生。
LifecycleBoundObserver的onStateChanged()
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
@NonNull
 final LifecycleOwner mOwner;
LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
 super(observer);
 mOwner = owner;
 }
@Override
 boolean shouldBeActive() {
 return mOwner.getLifecycle()
 .getCurrentState().isAtLeast(STARTED);
 }
@Override
 public void onStateChanged(@NonNull LifecycleOwner source,
 @NonNull Lifecycle.Event event) {
 if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
 removeObserver(mObserver);
 return;
 }
 activeStateChanged(shouldBeActive());
 }
@Override
 boolean isAttachedTo(LifecycleOwner owner) {
 return mOwner == owner;
 }
@Override
 void detachObserver() {
 mOwner.getLifecycle().removeObserver(this);
 }
 }
onStateChanged()的逻辑是LifecycleBoundObserver中对接口LifecycleEventObserver的实现,通过对Lifecycle组件的了解,可以知道在LifecycleOwner的生命周期发生改变时,onStateChanged()方法就会被调用到。这里判断如果LifecycleOwner销毁了,那么就移除这个监听者,达到防止内存泄漏的目的,其它情况则会以shouldBeActivie()为值调用activeStateChanged()方法。shouldBeActivie()判断LifecycleOwner的状态是否处于STARTED之后,也就是是否显示在屏幕中,这里表明了LiveData的另一个特性,默认情况下,显示在屏幕中的页面中的监听者才会收到数据更新的通知。
ObserverWrapper的activeStateChanged()
private abstract class ObserverWrapper {
 final Observer<? super T> mObserver;
 boolean mActive;
 int mLastVersion = START_VERSION;
ObserverWrapper(Observer<? super T> observer) {
 mObserver = observer;
 }
abstract boolean shouldBeActive();
boolean isAttachedTo(LifecycleOwner owner) {
 return false;
 }
void detachObserver() {
 }
void activeStateChanged(boolean newActive) {
 if (newActive == mActive) {
 return;
 }
 // immediately set active state, so we’d never dispatch anything to inactive
 // owner
 mActive = newActive;
 boolean wasInactive = LiveData.this.mActiveCount == 0;
 LiveData.this.mActiveCount += mActive ? 1 : -1;
 if (wasInactive && mActive) {
 onActive();
 }
 if (LiveData.this.mActiveCount == 0 && !mActive) {
 onInactive();
 }
 if (mActive) {
 dispatchingValue(this);
 }
 }
 }
activeStateChanged()方法是在LifecycleBoundObserver的父类ObserverWrapper中实现的,先看ObserverWrapper的属性,ObserverWrapper不仅封装了监听者,还用mActive管理是否为活跃状态,以及用mLastVersion管理监听者当前的数据版本。回到activeStateChanged()方法,这里的处理主要分三点,首先,用活跃状态是否发生变化做了一个闭路逻辑,防止重复处理,比如onStart()处理后又接收到onResume()。其次,更新当前状态,并判断如果这是第一个监听者活跃,就调用onActive()方法,如果是最后一个监听者非活跃,就调用onInactive()方法。最后,如果是新的活跃状态,则以当前ObserverWrapper对象为参数值调用dispatchingValue()方法分发事件。
setValue()
@MainThread
protected void setValue(T value) {
 assertMainThread(“setValue”);
 mVersion++;
 mData = value;
 dispatchingValue(null);
 }
setValue()是LiveData的一个成员方法,用于在主线程中手动更新LiveData中的值,这里先将数据版本mVersion自增后,更新mData的值,并以null为参数值调用dispatchingValue()方法。
postValue()
protected void postValue(T value) {
 boolean postTask;
 synchronized (mDataLock) {
 postTask = mPendingData == NOT_SET;
 mPendingData = value;
 }
 if (!postTask) {
 return;
 }
 ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
 }
 private final Runnable mPostValueRunnable = new Runnable() {
 @SuppressWarnings(“unchecked”)
 @Override
 public void run() {
 Object newValue;
 synchronized (mDataLock) {
 newValue = mPendingData;
 mPendingData = NOT_SET;
 }
 setValue((T) newValue);
 }
 };
postValue()也是用来手动更新LiveData中的值的,不过和setValue()有区别的是,它可以在非主线程中调用。它的处理就是在保证线程安全的前提下,通知主线程调用setValue()方法更新数据。
具体细节是,定义一个volatile修饰的成员变量mPandingData,用作线程间共享数据,这个变量的默认值为NOT_SET。通过对共享数据mPandingData的读写访问进行加锁的方式实现线程安全,同时,主线程读取mPandingData的值后,也就被认为是消费掉了共享数据,这时会把mPandingData设置会默认值NOT_SET,而其他线程在拿到锁后写入mPandingData,也就是生产共享数据时,只有之前主线程已消费掉或还未生产过共享数据,才会向主线程发送处理消息。
这个逻辑实现了另外一个特性,当主线程还没来得及处理消息,这时多个线程同时排队拿锁更新数据,主线程最终只会使用最后最新的数据去处理,调用setValue()通知监听者。
dispatchingValue()

无论是生命周期回调的activeStateChanged()还是手动发起数据更新setValue(),最终都通过dispatchingValue()完成了数据更新的分发。
void dispatchingValue(@Nullable ObserverWrapper initiator) {
 if (mDispatchingValue) {
 mDispatchInvalidated = true;
 return;
 }
 mDispatchingValue = true;
 do {
 mDispatchInvalidated = false;
 if (initiator != null) {
 considerNotify(initiator);
 initiator = null;
 } else {
 for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
 mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
 considerNotify(iterator.next().getValue());
 if (mDispatchInvalidated) {
 break;
 }
 }
 }
 } while (mDispatchInvalidated);
 mDispatchingValue = false;
 }
dispatchingValue()如果传入的参数不为null,那么就针对该对象单独分发,对应的就是生命周期回调的调用。而如果传入了null,那就遍历mObservers,对每一个监听者完成分发。每次分发是调用considerNotify()完成。
dispatchingValue()的处理中首先使用了两个成员变量mDispatchingValue和mDispatchInvalidated做了一个短路逻辑,这俩成员变量分别表示是否处于分发中和分发的数据是否过期。进入分发过程时,会将mDispatchingValue置为true,mDispatchInvalidated置为false,这时表示处于正常的分发状态。如果在正常分发状态时,再有新的分发请求,那么就会将mDispatchInvalidated值为true,正常的分发状态便会中断,重新开始分发。这就实现了一个特性,只对监听者通知最新的数据。
可以使用下面的单元测试加深对该特性的理解。
@Test
 public void testSetValueDuringSetValue() {
 mOwner.handleLifecycleEvent(ON_START);
 final Observer observer1 = spy(new Observer() {
 @Override
 public void onChanged(String o) {
 assertThat(mInObserver, is(false));
 mInObserver = true;
 if (o.equals((“bla”))) {
 mLiveData.setValue(“gt”);
 }
 mInObserver = false;
 }
 });
 final Observer observer2 = spy(new FailReentranceObserver());
 mLiveData.observe(mOwner, observer1);
 mLiveData.observe(mOwner, observer2);
 mLiveData.setValue(“bla”);
 verify(observer1, Mockito.atMost(2))
 .onChanged(“gt”);
 verify(observer2, Mockito.atMost(2))
 .onChanged(“gt”);
 }
这个单元测试在源码库中可以找到,有兴趣的同学可以debug一下看看处理流程,后面会介绍一下这个技巧,这里先简单描述一下代码执行过程。
在这个单元测试中,对于mLiveData有两个监听者observer1和observer2,正常情况下,当mLiveData.setValue(“bla”)时,dispatchingValue()对监听者进行遍历,两个监听者应该依次收到数据“bla”的通知,但是observer1在收到“bla”后,又执行mLiveData.setValue(“gt”)发起了新的数据更新,这个第二次dispatchingValue()便会短路,且会中断并重启第一次的遍历,于是observer1会再次收到“gt”,然后才是observer2,它只会收到“gt”。
这个流程便是保证了数据更新只通知最新的,在实际开发中如果遇到setValue()的过程中再次setValue()的情况,就需要特别注意一下这条特性。
considerNotify()
private void considerNotify(ObserverWrapper observer) {
if (!observer.mActive) {
 return;
 }
 // Check latest state b4 dispatch. Maybe it changed state but we didn’t get the event yet.
 //
 // we still first check observer.active to keep it as the entrance for events. So even if
 // the observer moved to an active state, if we’ve not received that event, we better not
 // notify for a more predictable notification order.
 if (!observer.shouldBeActive()) {
 observer.activeStateChanged(false);
 return;
 }
 if (observer.mLastVersion >= mVersion) {
 return;
 }
 observer.mLastVersion = mVersion;
 observer.mObserver.onChanged((T) mData);
 }
considerNotify()才是最终发起数据更新通知的方法,这里首先检查了监听者及其所处生命周期的活跃状态,并比较了监听者的数据版本和当前数据版本,保证了监听者所在页面处于前台时并且数据版本需要更新时才发起通知。发起通知前会更新监听者的数据版本到最新,确保数据一致。
LiveData特性
分析完这些主要方法后,便可以对LiveData的特性做一个总结了,以便在实际使用过程中更加得心应手。
总结
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
最后如何才能让我们在面试中对答如流呢?
答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:

这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,在这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。需要的小伙伴们可以点击我的GitHub获取免费领取方式

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以去我的主页加一下技术群。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!
不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
最后如何才能让我们在面试中对答如流呢?
答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:
[外链图片转存中…(img-XyRxZkCX-1645113966154)]
这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,在这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。需要的小伙伴们可以点击我的GitHub获取免费领取方式
[外链图片转存中…(img-oognYKyS-1645113966154)]
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以去我的主页加一下技术群。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!










