[英]Architecture components ViewModel vs. savedInstanceState bundle
試圖了解使用 ViewModel 保留 Activity 或 Fragment 的某些狀態並使用 savedInstanceState 包保存它們有什么區別。
印象中,在配置更改等情況下,當 os 銷毀活動/片段時,ViewModel 實例會保持活動狀態,以便在 os 重新創建活動/片段時,可以從仍然有效的 ViewModel 實例中獲取數據。
它是否適用於最小化應用程序並重新打開它?
做了一些測試,似乎最小化應用程序並重新打開應用程序,操作系統將使用 onCreate() 中的 stavedInstanceState 包重新創建活動/片段,而不是 null(調用 onSaveInstanceStae() 時保存的內容)。 但是 ViewModel 已被清除,因此創建了一個沒有以前數據的新實例。
這是否意味着雖然在這種情況下操作系統可以檢索保存的實例狀態並傳遞給活動/片段的 onCreate(),但是 ViewModel 必須是一個沒有先前實例數據的新實例,或者 viewModel 需要做一些額外的步驟為了跨實例存儲/恢復數據?
如果有人仍然想了解 onSavedState 與 ViewModel 之間的區別,這里是詳細解釋:
onSavedInstanceState : onSavedInstance 的主要用途不是處理方向更改,而是提供一種機制,在 Android 系統銷毀應用程序/活動時檢索數據。 當應用程序處於后台並且 Android 系統決定終止它時的示例情況,因為它需要一些其他高優先級進程的內存,然后在這種情況下,在活動被銷毀之前 onSavedInstanceState 將被調用。
onSavedInstanceState 只存儲 Parcelable 數據,它提供提示以在 Activity 重新啟動時為用戶恢復狀態。 它將數據保存在作為單獨進程的系統服務器中。
onSavedInstanceState 有數據限制。 只能保存少量 Parcelable 數據。
而對於 ViewModel
ViewModel 對象是應用程序進程內存的一部分,因此它能夠承受配置更改。 一旦進程終止,ViewModel 就會消失並且所有保存的狀態都將丟失。 因此,當活動重新啟動時,ViewModel 中沒有任何內容。
它用作重物的緩存。
ViewModel 中沒有限制。
重要提示:永遠記住ViewModel 和 SavedState 一起工作。 它們不是彼此的替代品或替代品。
可以在這篇博文中找到一個很好的解釋(以及您問題的解決方案)。 TLDR:視圖模型托管在持久片段中,該片段與托管活動一起重新創建。
來自:Kristin Marsicano 書籍“Android 編程:大書呆子牧場指南,第 4 版”。 :
ViewModel 與保存的實例狀態
雖然保存的實例狀態存儲了跨進程死亡的活動記錄,但它還存儲了跨配置更改的活動記錄。 首次啟動活動時,保存的實例狀態包為空。 當您旋轉設備時,操作系統會在您的活動上調用onSaveInstanceState(Bundle) 。 然后,操作系統將您藏在包中的數據傳遞給onCreate(Bundle?) 。
當您使用ViewModel為活動編排動態數據時,它真的很出色
ViewModel使跨配置更改繼續下載操作變得簡單。 它還提供了一種簡單的方法來保存在配置更改期間加載到內存中的數據開銷很大。 而且,如您所見,一旦用戶完成活動, ViewModel就會自動清理。
ViewModel不會在進程死亡場景中發光,因為它會與進程及其中的所有內容一起從內存中擦除。 這是保存的實例狀態占據中心位置的地方。 但是保存的實例狀態有其自身的局限性。 由於保存的實例狀態被序列化到磁盤,你應該避免隱藏任何大型或復雜的對象。
Lifecycle-viewmodel-savedstate是一個剛剛發布的新庫,它允許ViewModel在進程死亡時保存它們的狀態。 這應該可以減輕將ViewModel與活動中保存的實例狀態一起使用的一些困難。
使用保存的實例狀態來存儲重新創建 UI 狀態所需的最少信息(例如,當前問題索引)。 使用ViewModel緩存在配置更改時在內存中填充 UI 所需的豐富數據集,以便快速輕松地訪問。
在進程死亡后重新創建活動時,使用保存的實例狀態信息來設置ViewModel ,就好像ViewModel和活動從未被銷毀一樣。
在撰寫本文時,沒有簡單的方法可以確定是否在進程死亡與配置更改后重新創建活動。 為什么這很重要? ViewModel在配置更改期間保留在內存中。 因此,如果您在配置更改后使用保存的實例狀態數據來更新ViewModel ,那么您正在使您的應用程序執行不必要的工作。 如果工作導致用戶等待或不必要地使用他們的資源(如電池),則這種冗余工作是有問題的。
解決此問題的一種方法是使您的ViewModel更智能一些。 當設置ViewModel值可能會導致更多工作時,請先檢查數據是否新鮮,然后再進行拉入和更新其余數據的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.