本文基于SDK 29
一、ViewModel與LiveData的作用:
1、viewModel:
資料共享,螢屏旋轉不丟失資料,并且在Activity與Fragment之間共享資料,
2、LiveData:
感知生命周期并且通知觀察者重繪,防止記憶體泄漏,
一下用流程圖的方式說明一下其是怎么作業的:
1、ViewModel的構造:

2、LiveData注冊監聽:

3、資料改變通知重繪:
LiveData中:

總結:
1、ViewMode之所以能夠共享資料,是因為其被放在ViewModelStore 中,而ViewModelStore 被放在NonConfigurationInstances(Activity中)這個靜態類中,
2、如果Activity被銷毀,那么viewModel會被清除,如果是由于橫豎屏切換引起的就不會,
if (event == Lifecycle.Event.ON_DESTROY) { if (!isChangingConfigurations()) { getViewModelStore().clear(); }
3、LiveDate.observe注冊觀察者的時候,觀察者不但會被存放在LiveData的SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers中,而且還會被放在ComponentActivity的LifecycleRegistry中的
FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap中,
當生命周期進入destroy的時候,會獲取LifecycleRegistry的mObserverMap,獲取LiveData中的LifecycleBoundObserver并呼叫onStateChanged方法,將SafeIterableMap中的observer移除,再將LifecycleRegistry的FastSafeIterableMap中的
observer移除,
4、一個observer可以重復被添加,所以注意在一個Activity或者Fragment中只呼叫一次LiveDate.observe,否則會有多次回呼,
5、每次LiveData進行setValue的時候,mVersion++,在回呼之前進行判斷(
observer.mLastVersion >= mVersion
)防止沒有setValue重繪資料卻在生命周期變換的時候進行回呼,
6、生命周期至少得在onStart才會回呼observer,即onStart和onResume可以,其它生命周期不行,
boolean shouldBeActive() { return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430239.html
標籤:Android
