AACのLiveDataのsetValueとpostValueの違いについて
コードを追ってみた
val liveData:MutableLiveData<String> = MutableLiveData<String>() fun useSetValue() { liveData.value = "aaa" } fun usePostValue() { liveData.postValue("aaa") }
setValue
の方はどうやらMainThread
でしか使用できないらしい。
確かにコードを実際に見てみると
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使うのが安全だよってことで