我们先来举个例子:
- class MainActivity : AppCompatActivity() {
-
- companion object {
- val liveData = MutableLiveData
() - }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- val tvSend = findViewById
(R.id.tv_send) - tvSend.setOnClickListener {
- Thread {
- liveData.postValue("hello lzy")
- }.start()
- }
- val btn = findViewById
- btn.setOnClickListener {
- startActivity(Intent(this, SecondActivity::class.java))
- }
- }
-
- }
SecondActiviy代码:
- class SecondActivity : AppCompatActivity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_second)
- MainActivity.liveData.observe(this) {
- Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
- }
- }
-
- }
大家觉得SecondActivity的吐司会不会弹呢?我们试一把:

有些同学可能有这样的疑惑:第二个activity还没有创建(还没有observe),为啥在第二个activity还能监听到livaData的数据变化?带着这样的疑惑进入今天的主题吧:
- @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);//1
- ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);//2
- 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);//3
- }
我们先来看上面一段代码:
注释1处:将SecondActivity对象和Observer对象封装到LifecycleBoundObserver对象里面去;
注释2处:将Observer对象作为键,LifecycleBoundObserver对象作为值放到mObservers里面去;
注释3处:将wrapper和owner生命周期绑定。
前面学习Lifecycle原理我们了解到addObserver最终会走到:
- static class ObserverWithState {
- State mState;
- LifecycleEventObserver mLifecycleObserver;
-
- ObserverWithState(LifecycleObserver observer, State initialState) {
- mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);//1
- mState = initialState;
- }
-
- void dispatchEvent(LifecycleOwner owner, Event event) {
- State newState = event.getTargetState();
- mState = min(mState, newState);
- mLifecycleObserver.onStateChanged(owner, event);//2
- mState = newState;
- }
- }
这里面很明显是两个流程,我们先来看流程1。
流程1:
我们注意到,我们传进来的observer其实是一个LifecycleBoundObserver,进注释1处的方法:
- @NonNull
- static LifecycleEventObserver lifecycleEventObserver(Object object) {
- boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
- ···
-
- if (isLifecycleEventObserver) {
- return (LifecycleEventObserver) object;
- }
-
- ···
- }
又因为:
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver
再来看下分发流程,我们来看ReportFragment里面的方法:
- static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
- if (activity instanceof LifecycleRegistryOwner) {
- ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
- return;
- }
-
- if (activity instanceof LifecycleOwner) {
- Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
- if (lifecycle instanceof LifecycleRegistry) {
- ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);//1
- }
- }
- }
走注释1:
- public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
- enforceMainThreadIfNeeded("handleLifecycleEvent");
- moveToState(event.getTargetState());
- }
接着看:
- private void moveToState(State next) {
- if (mState == next) {
- return;
- }
- mState = next;
- if (mHandlingEvent || mAddingObserverCounter != 0) {
- mNewEventOccurred = true;
- // we will figure out what to do on upper level.
- return;
- }
- mHandlingEvent = true;
- sync();//1
- mHandlingEvent = false;
- }
进注释1:
- 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);
- }
- Map.Entry
newest = mObserverMap.newest(); - if (!mNewEventOccurred && newest != null
- && mState.compareTo(newest.getValue().mState) > 0) {
- forwardPass(lifecycleOwner);//1
- }
- }
- mNewEventOccurred = false;
- }
进注释1:
- private void forwardPass(LifecycleOwner lifecycleOwner) {
- Iterator
> ascendingIterator = - mObserverMap.iteratorWithAdditions();
- while (ascendingIterator.hasNext() && !mNewEventOccurred) {
- Map.Entry
entry = ascendingIterator.next(); - ObserverWithState observer = entry.getValue();
- while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
- && mObserverMap.contains(entry.getKey()))) {
- pushParentState(observer.mState);
- final Event event = Event.upFrom(observer.mState);
- if (event == null) {
- throw new IllegalStateException("no event up from " + observer.mState);
- }
- observer.dispatchEvent(lifecycleOwner, event);//1
- popParentState();
- }
- }
- }
再进注释1:
- 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 = event.getTargetState();
- mState = min(mState, newState);
- mLifecycleObserver.onStateChanged(owner, event);
- mState = newState;
- }
- }
这样就走到了dispatchEvent方法里面了。分发流程具体的可以去看博主的另一篇博客:
上面我们讲到mLifecycleObserver其实是一个LifecycleBoundObserver,那我们就进源码看看:
- 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);//2
- }
-
- @Override
- public void onStateChanged(@NonNull LifecycleOwner source,
- @NonNull Lifecycle.Event event) {
- Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
- if (currentState == DESTROYED) {
- removeObserver(mObserver);
- return;
- }
- Lifecycle.State prevState = null;
- while (prevState != currentState) {
- prevState = currentState;
- activeStateChanged(shouldBeActive());//1
- currentState = mOwner.getLifecycle().getCurrentState();
- }
- }
-
- @Override
- boolean isAttachedTo(LifecycleOwner owner) {
- return mOwner == owner;
- }
-
- @Override
- void detachObserver() {
- mOwner.getLifecycle().removeObserver(this);
- }
- }
分发里面调用了mLifecycleObserver.onStateChanged(owner, event);
我们来看注释1处:
- void activeStateChanged(boolean newActive) {
- if (newActive == mActive) {
- return;
- }
- // immediately set active state, so we'd never dispatch anything to inactive
- // owner
- mActive = newActive;
- changeActiveCounter(mActive ? 1 : -1);
- if (mActive) {
- dispatchingValue(this);
- }
- }
mActive默认为false。为了理解这块代码,我们要先看一个东西:
- boolean shouldBeActive() {
- return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
- }
- public enum State {
-
- DESTROYED,
- INITIALIZED,
- CREATED,
- STARTED,
- RESUMED;
- public boolean isAtLeast(@NonNull State state) {
- return compareTo(state) >= 0;
- }
- }
满足条件的状态值只有:STARTED和RESUMED。

所以当ON_START事件分发后,newActivie值是为true的。这个时候接着往下走:
- 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
super T>, ObserverWrapper>> iterator = - mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
- considerNotify(iterator.next().getValue());
- if (mDispatchInvalidated) {
- break;
- }
- }
- }
- } while (mDispatchInvalidated);
- mDispatchingValue = false;
- }
接着看:
- private void considerNotify(ObserverWrapper observer) {//LifecycleBoundObserver
- if (!observer.mActive) { //mActive为true 不走
- 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);
- }
还有一个点要补充一下:
dispatchingValue(this)
这个this是啥?
- 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;
- changeActiveCounter(mActive ? 1 : -1);
- if (mActive) {
- dispatchingValue(this);
- }
- }
- }
可见,这是一个抽象类,那么肯定有谁继承了它!
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver
原来就是LifecycleBoundObserver!
前面我们知道:
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
这样子再看前面的分发流程是不是会恍然大悟!