用一个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循环把新数据处理一遍退出。
这个方法写的非常精练。