LiveData
LiveData是一個數(shù)據(jù)持有類,它可以通過添加觀察者被其他組件觀察其變更。不同于普通的觀察者,它最重要的特性就是可以感知應用程序的生命周期,如在Activity中如果數(shù)據(jù)更新了但Activity已經是destroy狀態(tài),LivaeData就不會通知Activity(observer)。
LiveData感知生命周期的原理,是因為它實現(xiàn)了LifecycleObserver接口。

生命周期的感知,是通過ComponentActivty中注入的ReportFragment實現(xiàn)的。在ReportFragment的生命周期函數(shù)調用時,會通過LifecycleRegistry通知所有注冊的LifecycleObserver接口實現(xiàn)。
相較于功能類似的ObservableField,livedata還有以下優(yōu)勢:
1,ObservableField只有在數(shù)據(jù)發(fā)生改變時UI才會收到通知,而LiveData不同,只要你postValue或者setValue,UI都會收到通知,不管數(shù)據(jù)有無變化,
2,LiveData能感知Activity的生命周期,在Activity不活動的時候不會觸發(fā),例如一個Activity不在任務棧頂部
ViewModel
ViewModel同樣是一個生命周期組件,它不會受Activity橫豎屏切換導致的銷毀重建影響,而是在Activity生命周期內一直存在。這種特性在實際中主要用來獲取Model層的數(shù)據(jù),因為這樣就不需要頻繁地重建連接,也不需要編寫狀態(tài)保存代碼。
ViewModel生命周期的特性,其實是依靠FragmentActivity中ViewModelStore的生命周期特性而來的,具體請見圖:

ViewModelProviders其實是把創(chuàng)建的ViewModel通過Map容器保存在了FragmentActivity的成員變量ViewModelStore中,依靠FragmentActivity本身的能力實現(xiàn)了ViewModel的生命周期特性。那么FragmentActivity是怎么保存ViewModelStore的呢?

其實當Activity橫豎屏轉換時,F(xiàn)ragmentActivity會new一個包含當前ViewModelStore信息的NonConfigurationInstances,并使用ActivityClientRecord,通過Binder將NonConfigurationInstances發(fā)往服務端的ActivityRecord進行保存。

Activity銷毀時,其實其中保存的ViewModelStore也是會被銷毀的。

當Activity重新構建時,會再向ActivityRecord獲取包含銷毀前ViewModelStore信息的NonConfigurationInstances。這樣新的Activity就擁有了之前的ViewModelStore,看起來就好像經歷了Activity橫豎屏轉換的ViewModel一直存在一樣。
ViewModel結合LiveData使用
LiveData通常會配合ViewModel來使用,ViewModel負責觸發(fā)數(shù)據(jù)的更新,更新會通知到LiveData,然后LiveData再通知活躍狀態(tài)的觀察者。
LiveData由ViewModel創(chuàng)建,它內含數(shù)據(jù)源和UI響應數(shù)據(jù)變化的回調Observer?;卣{通過LiveData的observe函數(shù)傳入:
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
owner.getLifecycle().addObserver(wrapper);
}