MutableLiveData笔记

  • MutableLiveData是什么?
  • LiveData是什么?
  • LiveData常用的方法
  • MutableLiveData和LiveData的区别
  • 关于postValue和setValue的机制简单理解


MutableLiveData是什么?

public class MutableLiveData
extends LiveData<T>

java.lang.Object
   ↳	android.arch.lifecycle.LiveData<T>
 	   ↳	android.arch.lifecycle.MutableLiveData<T>

MutableLiveDataLiveData的子类

LiveData是什么?

Android mutablelivedata 收不到通知 android livedata postvalue_数据


Android的官方文档种描述为可以在给定生命周期观察数据持有类

Android mutablelivedata 收不到通知 android livedata postvalue_数据_02


因此生命周期拥有者应和观察者成对添加,使用observe:当LiveData中的数据发生变化时,并且生命周期的状态为START或是RESUME状态时,观察者就能观察到数据变化。这么做的原因是避免资源的浪费,当所有者的状态变为destroy状态,观察者将自动被移除。

LiveData常用的方法

  • postValue

    作用是在子线程更新数据,当然在主线程中也可以使用。
  • setValue

    作用是在主线程中修改数据,注意只能在主线程中调用

注意两个方法都是protected修饰的,因此一般封装一个继承LiveData的类,在该类的中调用此方法。

  • observe
void observe (LifecycleOwner owner, 
                Observer<T> observer)

作用是添加生命周期拥有者和观察者,当拥有者处于活跃状态时,观察者能接收到数据更新。

  • observeforever
void observeForever (Observer<T> observer)

作用是观察数据变化,可以无视生命周期的变化,因此需要手动移除。
注意,此时已不需要添加生命周期拥有者。
为什么可以不添加生命周期拥有者呢?因为这个方法的作用就如他的名字一样,一直观察数据是否变化。

@MainThread
    public void observeForever(@NonNull Observer<? super T> observer) {
        assertMainThread("observeForever");
        AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing != null && existing instanceof LiveData.LifecycleBoundObserver) {
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        if (existing != null) {
            return;
        }
        wrapper.activeStateChanged(true);
    }

最后一行就是其中的秘密

void activeStateChanged(boolean newActive) {
    if (newActive == mActive) {
        return;
    }
    // immediately set active state, so we'd never dispatch anything to inactive
    // owner
    mActive = newActive;
    boolean wasInactive = LiveData.this.mActiveCount == 0;
    LiveData.this.mActiveCount += mActive ? 1 : -1;
    if (wasInactive && mActive) {
        onActive();
    }
    if (LiveData.this.mActiveCount == 0 && !mActive) {
        onInactive();
    }
    if (mActive) {
        dispatchingValue(this);
    }
}

在observeForever方法中调用wrapper.activeStateChanged(true),将其设置为常量true。

同比observer方法,是将生命周期拥有者传入,再进行观察,如果状态发生改变立刻调用activeStateChanged。

Android mutablelivedata 收不到通知 android livedata postvalue_android studio_03


Android mutablelivedata 收不到通知 android livedata postvalue_android_04

  • removeObserver
void removeObserver (Observer<T> observer)

作用是移除指定的观察者

  • removeObservers
void removeObservers (LifecycleOwner owner)

作用是移除指定的生命周期拥有者下的所有观察者

MutableLiveData和LiveData的区别

其实MutableLiveData的源码很简单

Android mutablelivedata 收不到通知 android livedata postvalue_android studio_05


只有两个方法postValue和setValue,但是和LiveData的区别就在于是用public修饰的。

因此个人觉得会比LiveData方便一些。

关于postValue和setValue的机制简单理解

调用postValue后执行顺序

Android mutablelivedata 收不到通知 android livedata postvalue_android studio_06


从这里可以看出调用了setValue

Android mutablelivedata 收不到通知 android livedata postvalue_数据_07


Android mutablelivedata 收不到通知 android livedata postvalue_android_08


Android mutablelivedata 收不到通知 android livedata postvalue_android_09

Android mutablelivedata 收不到通知 android livedata postvalue_android_10


这里调用了观察者的onChanged方法,此时观察者可以接收到数据变化。

不足之处欢迎批评