原文地址:https://blog.csdn.net/zhanglei5415/article/details/131434931 ## 一、問題 當對含有中文的url字元串,進行NSURL對象包裝時,是不能被識別的。 不會得到期望的NSURL對象,而是返回一個nil 值 ; ```objectiv ...
LiveData本身不能在進程銷毀中存活,當記憶體不足時,Activity被系統殺死,ViewModel本身也會被銷毀。 為了保存LiveData的數據,使用SavedStateHandle。 事故場景: 進程銷毀後,重新去通過ViewModel去獲取LiveData數據,獲取到的數據是null。 這表示ViewModel不具備onSavedInstance的功能。 引入SavedStateHandle,進程銷毀重建就可以獲取到數據:
private SavedStateHandle mState; public SavedStateViewModel(SavedStateHandle savedStateHandle) { mState = savedStateHandle; } private static final String NAME_KEY = "name"; // Expose an immutable LiveData LiveData<String> getName() { return mState.getLiveData(NAME_KEY); } void saveNewName(String newName) { mState.set(NAME_KEY, newName); }
在上述代碼的情況下,進程銷毀,ViewModel重建,重新獲取LiveData,就不會為為null了。
相比與onSaveInstanceState 不用重寫onSaveInstanceState就可以獲得保存狀態數據的功能,這就是最大的優點。 可以替代Bundle,不需要從Activity獲取和發送數據,之前的做法是,數據保存在onSavedInstanceState回調方法中的Bundle,然後重建的時候,通過onCreate方法中的Bundle獲取。 SavedStateHandle的效果跟Bundle一樣,也是只能保存少量數據。 ViewModel的生命周期: 可以看出ViewModel的生命周期Scope,不包含回調函數onSavedInstanceStatehttps://medium.com/androiddevelopers/viewmodels-persistence-onsaveinstancestate-restoring-ui-state-and-loaders-fc7cc4a6c090 https://developer.android.com/codelabs/android-lifecycles#6 https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-savedstate https://developer.android.com/codelabs/android-lifecycles#6 版權聲明: 作者:ttylinux 出處:http://www.cnblogs.com/ttylinux/ 本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。