LiveData源码分析

1.在上一篇文章中介绍了LiveData的简单使用,可以查看LiveData简单使用_niuyongzhi的博客-CSDN博客

源码分析:

也可以分成两部分来看,一部分是注册observe源码,另一部分是setValue的源码。

先看Observe注册监听的方法。

1)先看liveData.observe()

 MutableLiveData<Person> liveData = new MutableLiveData();
    
 liveData.observe(this, new Observer<Person>() {
      @Override
      public void onChanged(Person person) {
             ageTv.setText(String.valueOf(person.age));
             nameTv.setText(person.name);
          }
  });
    private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
            new SafeIterableMap<>();


    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            return;
        }
        //定义了一个Observer的包装类,用于数据变化时的回调。
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        //将wrapper存入一个HashMap中,
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        ....
        //向LifeCycle注册监听,这样wrapper就可以感知Activity声明周期变化。
        owner.getLifecycle().addObserver(wrapper);
    }

 看下这个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);
        }
        
        //在收到Activity生命周期变化时,会回调这个方法。
        @Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
             //拿到当前的状态
            Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
            if (currentState == DESTROYED) {
                //如果Activity的状态是销毁状态,则会从集合中移除注册的observer,防止内存泄露
                removeObserver(mObserver);
                return;
            }
            //状态同步
            Lifecycle.State prevState = null;
            while (prevState != currentState) {
                prevState = currentState;
                activeStateChanged(shouldBeActive());
                currentState = mOwner.getLifecycle().getCurrentState();
            }
        }

        @Override
        boolean isAttachedTo(LifecycleOwner owner) {
            return mOwner == owner;
        }

        @Override
        void detachObserver() {
            mOwner.getLifecycle().removeObserver(this);
        }
    }

 看activeStateChanged()方法 更新状态。

 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);
            }
        }

    2)在看setValue中做了啥

     //看setValue的执行逻辑
      protected void setValue(T value) {
        //不是运行在主线程,抛异常
        assertMainThread("setValue");
        //版本控制,每调用一次setValue,version加1
        mVersion++;
        mData = value;
        //数据分发,注意这里传的参数是null
        dispatchingValue(null);
      }

看dispatchingValue方法

 private void dispatchingValue(@Nullable ObserverWrapper initiator) {
        if (mDispatchingValue) {
            mDispatchInvalidated = true;
            return;
        }
        mDispatchingValue = true;
        do {
            mDispatchInvalidated = false;
            if (initiator != null) {
                considerNotify(initiator);
                initiator = null;
            } else {
               //由于上面传过来的参数是null,所以会执行这个循环遍历mObservers
               //而mObservers就保存了向liveData添加的observer
                for (Iterator<Map.Entry<Observer<T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

由于上面参数initiator传递过来的是null,所以会执行到for循环中的     considerNotify(iterator.next().getValue());  iterator.next().getValue()拿到的就是ObserverWrapper的实例。

再看considerNotify方法()

 private void considerNotify(ObserverWrapper observer) {
       //如果观察在没有处于活跃状态,则不会受到更新的数据
        if (!observer.mActive) {
            return;
        }
        //这个判断是LifeCycleOwner的状态是否处于活跃状态
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);
            return;
        }
        //如果Observer中的版本已经是最新的,则不会更新
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        observer.mLastVersion = mVersion;
        //调用observer中的回调方法。
        //observer就是上面创建的LifecycleBoundObserver的实例
        //mObserver就是添加的观察者
        observer.mObserver.onChanged((T) mData);
    }

 if (!observer.mActive) {
            return;
        }

这行代码,就控制了,不是活跃状态的观察者,不会去更新数据,保证处于前台的Activity中的LiveData,会刷新UI。

2.LiveData的粘性事件:

在第一个Activity中调用 liveData.setValue("main");已经注册的Observer能够收到消息。
当跳转到第二个Activity向第一个Activity中的LiveData添加Observer时,也会收到之前发送的消息。
这样的情况就是粘性事件。
正常的流程是  new LiveData----addObserver---setValue--收到消息
粘性事件的流程是 new LiveData---setValue-----addObserver--收到消息。
LiveData的粘性事件,并不是他的bug,而是出于某种业务需要才这样做到的,就是为了确保数据更新后,即使打开新的Activity也能够显示最新的数据。如果不期望这种效果,由于目前LiveData还没有提供这样的Api,所以得需要我们自己来实现。

LiveData出现粘性事件的源码分析。

由于第二个Activity也是实现了LifecycleOwner,也会调用ReportFragment的dispatch(Lifecycle.Event event)方法

private void dispatch(Lifecycle.Event event) {
    if (activity instanceof LifecycleOwner) {
        Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
        if (lifecycle instanceof LifecycleRegistry) {
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

看过LifeCycle源码分析的,对后面的执行流程应该很熟悉。

 static class ObserverWithState {
        State mState;
        GenericLifecycleObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {
            mLifecycleObserver = Lifecycling.getCallback(observer);
            mState = initialState;
        }

        void dispatchEvent(LifecycleOwner owner, Event event) {
            State newState = getStateAfter(event);
            mState = min(mState, newState);
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
 }

直接看到这里mLifecycleObserver是谁的实例?看Lifecycling.getCallback(observer);
在LifeCycle的回调中返回的是ReflectiveGenericLifecycleObserver的实例。
但是在LiveData中mLifecycleObserver是LifecycleBoundObserver的实例,实现了GenericLifecycleObserver接口。
 在调用LiveData.Observer()创建了LifecycleBoundObserver的实例。

 static GenericLifecycleObserver getCallback(Object object) {
        if (object instanceof FullLifecycleObserver) {
            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);
        }
        //LiveData中传进来的是LifecycleBoundObserver
        //所以在这里就return了
        if (object instanceof GenericLifecycleObserver) {
            return (GenericLifecycleObserver) object;
        }

        .......
        return new ReflectiveGenericLifecycleObserver(object);
    }

看LiveData.Observer()源码,创建了LifecycleBoundObserver对象,并作为观察者,添加到了LifeCycle中

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    owner.getLifecycle().addObserver(wrapper);
}

在addObserver中,用ObserverWithState对LifecycleBoundObserver进行了一层封装。

 public void addObserver(@NonNull LifecycleObserver observer) {
    State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
    ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
    ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
}

综上代码,可以知道  mLifecycleObserver.onStateChanged(owner, event);
调用的是LifecycleBoundObserver的onStateChanged方法。

public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        //如果当前Activity是Destroy的,则回收Observer,防止发送内存泄露
        if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
            removeObserver(mObserver);
            return;
        }
        activeStateChanged(shouldBeActive());
  }
 //删除的LiveData中该Activity(LifecycleOwner)添加的observer,
 //在LiveData.Observer时会传入LifecycleOwner,
 public void removeObserver(@NonNull final Observer<T> observer) {
     assertMainThread("removeObserver");
     ObserverWrapper removed = mObservers.remove(observer);
     if (removed == null) {
         return;
     }
     removed.detachObserver();
     removed.activeStateChanged(false);
 }
activeStateChanged(shouldBeActive());
//shouldBeActive判断是Activity是否是线上状态。
 boolean shouldBeActive() {
    return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}
//在第二个Activity启动后,这个newActive传过来的是true
void activeStateChanged(boolean newActive) {
    //mActive默认是false,newActive是true
    if (newActive == mActive) {
        return;
    }
    mActive = newActive;
    boolean wasInactive = LiveData.this.mActiveCount == 0;
    //记录avtiveCount,如果活跃加1否则减1
    LiveData.this.mActiveCount += mActive ? 1 : -1;
    if (wasInactive && mActive) {
        onActive();
    }
    if (LiveData.this.mActiveCount == 0 && !mActive) {
        onInactive();
    }
    if (mActive) {
        dispatchingValue(this);
    }
}
//dispatchingValue把this传进来了,所以下面代码会执行if判断的第一个分支
 private void dispatchingValue(@Nullable ObserverWrapper initiator) {
        if (mDispatchingValue) {
            mDispatchInvalidated = true;
            return;
        }
        mDispatchingValue = true;
        do {
            mDispatchInvalidated = false;
            //initiator不是null执行这里
            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;
  }
 private void considerNotify(ObserverWrapper observer) {
       //observer.mActive 为true
        if (!observer.mActive) {
            return;
        }
        //observer.shouldBeActive()为true
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);
            return;
        }
        //mVersion是LiveData的变量,会大于0
        //observer.mLastVersion初始值是0,
        //所以这个分支判断也不会进来
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        //版本同步
        observer.mLastVersion = mVersion;
        //这行代码,就会调用observer的onChange方法
        observer.mObserver.onChanged((T) mData);
    }

所以在第二个Activity中添加的observer就收到了第一个Activity发送的消息。
 这就是LiveData粘性事件的源码执行原理。
 如果想要消除这种粘性事件,通过上面的代码分析,我们可以修改添加的Observer的mLastVersion值,
 使它在初始化时就和LiveData中的mVersion一致,就不会出现粘性事件。

3. liveData.observeForever(observer)

 liveData.observeForever 是一个和Activity声明周期无关的消息订阅与发送的方法

public void observeForever(@NonNull Observer<T> observer) {
    AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
    ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);

    if (existing != null) {
        return;
    }
    //这个参数是true
    wrapper.activeStateChanged(true);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

niuyongzhi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值