Android 的 ViewModel 機制源碼解析

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 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索