爲什麼要用ViewModel

 

ViewModel是用來存儲UI相關的數據的,Activity在橫豎屏變化的時候會被銷燬,然後再重新創建,如果你把你的數據存儲在Activity中,那麼新建Activity的時候這些數據就沒有了,用戶就會很疑惑,屏幕旋轉了下怎麼界面的東西就沒了?所以需要把界面相關的數據存儲下來,下回接着用。使用ViewModel就可以做到這一點。

你可能會問,我的App只有豎屏是不是需要考慮這些了?

答案是否定的。這種Activity重新創建的情況有很多,只要發生了configuration changes,就會重建,橫豎屏切換隻是其中最典型的一種,其他還有十幾種,比如字體變化和語言切換等,你總不可能每一種都不管吧,用戶瞎操作出問題了咋辦。

首先需要先添加依賴,在build.gradle加入:

然後需要介紹一下ViewModel抽象類,Activity的數據類都需要繼承它。ViewModel類只有一個onCleared()方法,當這個ViewModel對象不再需要的時候,會調用這個方法,你可以做一些清理資源的操作。什麼時候算是“不再需要呢”?當你按返回鍵,這個Activity銷燬的時候,或者執行其他手動銷燬Activity的時候。注意在橫豎屏切換時,這個onCleared()是不會調用的,因爲這個ViewModel還沒結束使用。

MyData是我瞎寫的一個演示類,類的成員你可以依具體需求而定。

在Activity獲取MyData對象的時候,不是new一個,而是通過下面的代碼來獲取

通過ViewModelProvider.of()得到的ViewModelProvider將會和當前Activity的聲明週期進行綁定。也就是說你通過ViewModelProvider.get()得到的ViewModel對象,也將會和Activity聲明週期綁定。然後MyData就可以使用了,你可以將數據保存在MyData對象裏,這個時候發生橫豎屏切換,重建的Activity在onCreate中獲取的MyData對象還是之前的。

雖然我們用Activity來舉例,但是Fragment或其他LifecycleOwner實現都是適用的。ViewModel本身是不知道LifeCycle這些東西的。如果你的ViewModel需要用Context,那麼記得不要試圖去獲取LifecycleOwner,因爲LifecycleOwner是不知道Context是什麼東西的。你可以將你的ViewModel類繼承於AndroidViewModel類,後者有getApplication()方法提供ApplicationContext用。

 

拓展閱讀:https://www.jianshu.com/p/ef82c5962e7d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章