• LiveData源码分析


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

    源码分析:

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

    先看Observe注册监听的方法。

    1)先看liveData.observe()

    1. MutableLiveData<Person> liveData = new MutableLiveData();
    2. liveData.observe(this, new Observer<Person>() {
    3. @Override
    4. public void onChanged(Person person) {
    5. ageTv.setText(String.valueOf(person.age));
    6. nameTv.setText(person.name);
    7. }
    8. });
    1. private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
    2. new SafeIterableMap<>();
    3. @MainThread
    4. public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
    5. if (owner.getLifecycle().getCurrentState() == DESTROYED) {
    6. return;
    7. }
    8. //定义了一个Observer的包装类,用于数据变化时的回调。
    9. LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    10. //将wrapper存入一个HashMap中,
    11. ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    12. ....
    13. //向LifeCycle注册监听,这样wrapper就可以感知Activity声明周期变化。
    14. owner.getLifecycle().addObserver(wrapper);
    15. }

     看下这个LifecycleBoundObserver 类。

    1. class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
    2. @NonNull
    3. final LifecycleOwner mOwner;
    4. LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observersuper T> observer) {
    5. super(observer);
    6. mOwner = owner;
    7. }
    8. @Override
    9. boolean shouldBeActive() {
    10. return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
    11. }
    12. //在收到Activity生命周期变化时,会回调这个方法。
    13. @Override
    14. public void onStateChanged(@NonNull LifecycleOwner source,
    15. @NonNull Lifecycle.Event event) {
    16. //拿到当前的状态
    17. Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
    18. if (currentState == DESTROYED) {
    19. //如果Activity的状态是销毁状态,则会从集合中移除注册的observer,防止内存泄露
    20. removeObserver(mObserver);
    21. return;
    22. }
    23. //状态同步
    24. Lifecycle.State prevState = null;
    25. while (prevState != currentState) {
    26. prevState = currentState;
    27. activeStateChanged(shouldBeActive());
    28. currentState = mOwner.getLifecycle().getCurrentState();
    29. }
    30. }
    31. @Override
    32. boolean isAttachedTo(LifecycleOwner owner) {
    33. return mOwner == owner;
    34. }
    35. @Override
    36. void detachObserver() {
    37. mOwner.getLifecycle().removeObserver(this);
    38. }
    39. }

     看activeStateChanged()方法 更新状态。

    1. void activeStateChanged(boolean newActive) {
    2. if (newActive == mActive) {
    3. return;
    4. }
    5. // immediately set active state, so we'd never dispatch anything to inactive
    6. // owner
    7. mActive = newActive;
    8. changeActiveCounter(mActive ? 1 : -1);
    9. if (mActive) {
    10. dispatchingValue(this);
    11. }
    12. }

        2)在看setValue中做了啥

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

    看dispatchingValue方法

    1. private void dispatchingValue(@Nullable ObserverWrapper initiator) {
    2. if (mDispatchingValue) {
    3. mDispatchInvalidated = true;
    4. return;
    5. }
    6. mDispatchingValue = true;
    7. do {
    8. mDispatchInvalidated = false;
    9. if (initiator != null) {
    10. considerNotify(initiator);
    11. initiator = null;
    12. } else {
    13. //由于上面传过来的参数是null,所以会执行这个循环遍历mObservers
    14. //而mObservers就保存了向liveData添加的observer
    15. for (Iterator<Map.Entry<Observer<T>, ObserverWrapper>> iterator =
    16. mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
    17. considerNotify(iterator.next().getValue());
    18. if (mDispatchInvalidated) {
    19. break;
    20. }
    21. }
    22. }
    23. } while (mDispatchInvalidated);
    24. mDispatchingValue = false;
    25. }

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

    再看considerNotify方法()

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

     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)方法

    1. private void dispatch(Lifecycle.Event event) {
    2. if (activity instanceof LifecycleOwner) {
    3. Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
    4. if (lifecycle instanceof LifecycleRegistry) {
    5. ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
    6. }
    7. }
    8. }

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

    1. static class ObserverWithState {
    2. State mState;
    3. GenericLifecycleObserver mLifecycleObserver;
    4. ObserverWithState(LifecycleObserver observer, State initialState) {
    5. mLifecycleObserver = Lifecycling.getCallback(observer);
    6. mState = initialState;
    7. }
    8. void dispatchEvent(LifecycleOwner owner, Event event) {
    9. State newState = getStateAfter(event);
    10. mState = min(mState, newState);
    11. mLifecycleObserver.onStateChanged(owner, event);
    12. mState = newState;
    13. }
    14. }

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

    1. static GenericLifecycleObserver getCallback(Object object) {
    2. if (object instanceof FullLifecycleObserver) {
    3. return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);
    4. }
    5. //LiveData中传进来的是LifecycleBoundObserver
    6. //所以在这里就return了
    7. if (object instanceof GenericLifecycleObserver) {
    8. return (GenericLifecycleObserver) object;
    9. }
    10. .......
    11. return new ReflectiveGenericLifecycleObserver(object);
    12. }

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

    1. public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
    2. LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    3. ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    4. owner.getLifecycle().addObserver(wrapper);
    5. }

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

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

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

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

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

    3. liveData.observeForever(observer)

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

    1. public void observeForever(@NonNull Observer observer) {
    2. AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
    3. ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    4. if (existing != null) {
    5. return;
    6. }
    7. //这个参数是true
    8. wrapper.activeStateChanged(true);
    9. }

  • 相关阅读:
    【图像边缘检测】基于matlab自适应阈值的八方向和四方向sobel图像边缘检测【含Matlab源码 2058期】
    23种设计模式(二十)命令模式(阁瑞钛伦特软件-九耶实训)
    算法系列-力扣141-链表中环的检测(含数学证明)
    Pytorch重点概念笔记:都是本人学习中真实遇到的(一)
    南京邮电大学C++实验四(流运算符的重载及文件的使用)
    Java集合框架-Collection-List-vector(遗留类)
    成功解决ModuleNotFoundError: No module named ‘sklearn.ensemble.weight_boosting‘
    使用xlsxwriter简单的将截图插入excel表格中
    广告业务存储神器:华为云GaussDB(for Redis)
    工厂模式
  • 原文地址:https://blog.csdn.net/niuyongzhi/article/details/133353355