用一个for循环分发消息的时候会碰到for执行的过程中有新的消息进来,这个处理起来就需要一点技巧,LiveData这个类给出了一个实现:
private boolean mDispatchingValue;
private boolean mDispatchInvalidated;
private 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<T>, ObserverWrapper>> iterator =
mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
considerNotify(iterator.next().getValue());
if (mDispatchInvalidated) {
break;
}
}
}
} while (mDispatchInvalidated);
mDispatchingValue = false;
}
它定义了两个变量:"mDispatchInvalidated"和“mDispatchingValue”,先看它的处理主体,do...while循环,条件是mDispatchInvalidated,进入执行mDispatchInvalidated的值被设置为false,如果传入的参数是NULL,走else把所有的消息遍历一遍分发下去处理,如果这个循环在执行的过程中有新的消息,mDispatchInvalidated的值就被设置为true,for循环中断,进入do...while循环,等于是更新了一个循环列表,把新增加的数据添进来for循环遍历执行。
如果传入的参数非空,把传入数据处理掉后中while中检查mDispatchInvalidated是否为true,如果当前处理过程中执行的过程中有新数据产生,那么走do...while中的for循环把新数据处理一遍退出。
这个方法写的非常精练。