JetPack組件介紹

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的生命周期特性而來的,具體請見圖:


ViewModel和AppCompatActivity的關系

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

保存ViewModelStore

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

ViewModelStore銷毀

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

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);
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容