Android ViewModel 的好處是會隨 Activity 銷燬調用它的 clear() 方法。ide
咱們分析一下它是怎麼作到的。函數
1. 例子使用:源碼分析
a、 建立類 TestMvvmViewModel 繼承 ViewModel,重寫 onCleared() ,把清空的操做放在裏面;this
b、 在 actvity 或者 fragment 中使用 ViewModelProviders.of(this).get(TestMvvmViewModel.class) 獲取 TestMvvmViewModel 的實例;繼承
2. 源碼分析:生命週期
初始化 sDefaultFactory ,獲取 ViewModelStore ,用 sDefaultFactory 和 ViewModelStore 建立 ViewModelProvider 實例。get
sDefaultFactory 實例的類:源碼
建立 ViewModel 的實例的時候,先判斷是不是 AndroidViewModel 的字類,若是是就建立帶 Applictaion 的 ViewModel, 若是不是就走父類的建立函數,建立無參構造函數的 ViewModel 類。it
咱們再來看 ViewModelStore 的獲取:io
獲取該 activity 綁定的 HolderFragment 的 ViewModelStore,HolderFragment 是動態添加進去 activity 的:
在 HolderFragment 的 onDestroy() 調用了 mViewModelStore.clear(),遍歷調用了它的 ViewModel map 裏面的全部 ViewModel 的clear():
這時,咱們先理一下:
首先,ViewModelStore 是 HolderFragment 類的成員,而且在HolderFragment的 onDestroy() 調用了 clear(),遍歷調用了它的 ViewModel map 裏面的全部 ViewModel 的clear();
其次,HolderFragment 添加到了 Activity 或者 Fragment 中,因此 HolderFragment 的 onDestroy() 跟着 Activity 或者 Fragment 生命週期 onDestroy() (是HolderFragment 的 onDestroy() 先回調),
因此,當 Activity 要被銷燬的時候,ViewModel 會調用它的 clear() 方法。
接下來,看看是何時把 ViewModel 放進 ViewModelStore 的 ViewModel map 裏面的:
ViewModelProvider 的 get(Class modelClass) :
建立了 ViewModel 實例,並立刻添加進 ViewModelStore 的 ViewModel map 裏面。
總結一下, ViewModel 隨 Activity 銷燬調用它的 clear() 方法, 是藉助了 Fragment 和 Activity 生命週期綁定的機制。
補充:
1. 橫豎屏切換時,Activity 銷燬重建,可是由於 ViewModel 依賴的 HolderFragment 設置了 setRetainInstance(true),因此在橫豎屏切換的時候 HolderFragment 的 onDestroy() 沒有走,因此 ViewModel 的 onCleared() 也不會調用。
做者:keanbin 連接:https://www.jianshu.com/p/7cd7edf23761 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。