AACのLiveDataのsetValueとpostValueの違いについて

qiita.com

コードを追ってみた

val liveData:MutableLiveData<String> = MutableLiveData<String>()

fun useSetValue() {
  liveData.value = "aaa"
}

fun usePostValue() {
  liveData.postValue("aaa")
}

setValueの方はどうやらMainThreadでしか使用できないらしい。

lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java - platform/frameworks/support - Git at Google

確かにコードを実際に見てみると

setValue

    @MainThread
    protected void setValue(T value) {
        assertMainThread("setValue");
        mVersion++;
        mData = value;
        dispatchingValue(null);
    }

postValue

    protected void postValue(T value) {
        boolean postTask;
        synchronized (mDataLock) {
            postTask = mPendingData == NOT_SET;
            mPendingData = value;
        }
        if (!postTask) {
            return;
        }
        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
    }

assertMainThread("setValue"); ここでMainTheadによる実行なのか確認して、エラーを出していた

どちらを使うべきなのか?

synchronized (mDataLock) {
            postTask = mPendingData == NOT_SET;
            mPendingData = value;
        }

実際にこの部分がどれだけコストが高いかによるが… MainThreadで実行されることが確実なのであれば、setValueを使えばいいし、逆にどのThreadで実行されるかわからない場合(特段指定してない場合)などはpostValue使うのが安全だよってことで