關於MutableLiveData 與 SingleLiveEvent - lystyp/MVVMTest GitHub Wiki

MutableLiveData 的onChange會在data改變的時候觸發,

onChange何時會觸發呢?
MutableLiveData 在初始化的時候就會記錄目前的版本mVersion 是start version,
每改變一次值 mVersion +1(包含初始化個時候順便給值或是call setValue),
有個地方是判斷mLastVersion如果比mVersion 小,就call onChange通知其他人,

然後我註冊一個Observer callback到MutableLiveData ,Observer 初始化的時候會記錄他有一個mLastVersion 是start version,
這個就是用來判斷onChange用的,每次MutableLiveData 只要有值改變,他就會去把他身上被註冊的所有callback都叫來,然後一個一個比對他們的
mLastVersion,如果mLastVersion < mVersion ,Observer 的onChange就會被call,接著再mLastVersion = mVersion

另外,註冊Observer 的時候就會先比對一次:
有人註冊Callback了,那mLastVersion 有沒有比 mVersion小?onChange就會被call,接著再mLastVersion = mVersion
還有更複雜的規則啦,但基本就是會有這個
這樣會造成一個問題是,我如果在setValue之後才註冊callback,或者是螢幕翻轉(Avtivity會重新create就會重新註冊callback),
都會在意料之外的情況下又收到callback

有人建議解法用 SingleLiveEvent,但她還是會有問題在於這個SingleLiveEvent如果我註冊很多個callback,他只會發改變給一個callback,
簡單來講也就是說,

把MutableLiveData 改成SingleLiveEvent,基本原理都差不多,最主要只是差在
MutableLiveData 的mVersion 是自己記,而mLastVersion是Observer記
SingleLiveEvent則是Observer會去看SingleLiveEvent的一個紀錄現在事件是不是啟動的變數(好像叫mActivity),
如果值變更就設為false,接著Observer檢查這個,發現是false就送callback,接著把值改成true

SingleLiveEvent還是會有一些問題,應該有其他解法比較好
https://juejin.im/post/5bfb4d97f265da6130748b5f


>>> 用MutableLiveData來做data binding而不是用Observable物件

做法都跟Observable物件的binding一樣,只是差在
Observable物件在set值的時候,會一路通知到layout那邊叫他UI變更(透過binding物件),
但是MutableLiveData原先互動的對象只有自己的observe callback,並沒有包含binding那邊(就是layout那邊),

我猜啦!流程大概是下面那樣
Observable物件:
Binding在set variable的時候就會順便去監聽所有用到的物件,如果是不能監聽的物件就不監聽而已,一樣可以拿到一開始的值,
Observable物件變更值 > 通知所有觀察他的人(就是binding啦)“欸我資料變囉” > Binding去變更layout的值

MutableLiveData:
因為MutableLiveData不是可監聽的物件,所以值變的時候,跟binding沒什麼關係,
以上是舊版的MutableLiveData,
後來有支援data binding的新版MutableLiveData就不一樣了~~~
https://juejin.im/post/5a4b89e2f265da430e4f896f
好網址看不太懂,我自己猜一下,大概是
MutableLiveData新版現在是可以被觀察的物件了,只是仍然有一個問題是,MutableLiveData是follow 生命週期決定要不要通知觀察者的,
如果我不知道MutableLiveData要follow哪一個context的生命週期,那我就都不通知觀察者了(這裡是binding),因為沒有生命週期可以判斷
要不要傳,所以binding call setLifecycleOwner來設定監聽的MutableLiveData要follow哪一個context,這樣binding觀察MutableLiveData
才會真正work~~~~~~~~~~

⚠️ **GitHub.com Fallback** ⚠️