Android Architecture Components (第二篇)

Android Architecture Components 源碼分析 第二篇

本文已授權我就是馬云飛公眾號獨家發布。

說是源碼分析有點,其實就是簡單的根據源碼梳理一遍整體的LiveData,ViewModel和Lifecycle各個部分是如何工作的,由于本人水平有限,如果文中有錯誤的地方,歡迎指正。

Android Architecture Components 源碼分析系列文章

  1. Android Architecture Components 第一篇,介紹生命周期的感知。
  2. Android Architecture Components 第二篇,介紹ViewModel的控制。
  3. Android Architecture Components 第三篇,介紹LiveDate和LifeRegistry的協同操作。

作為MVVM 系列的第二篇,我們來看一下之前提出的第二個問題,就是ViewModel是如果控制生命周期的,并且保證在一定范圍內的唯一性。

ViewModel 的生命周期

先上一張官方的生命周期的圖:

可以看到ViewModel只有一個生命周期函數,那就是onCleared(),會在Activity的onDestroy之后執行, 那么相對應Fragment的生命周期是再哪個函數之后執行?這里先劇透一下,也是在onDestroy之后執行。

在看官方的實現之前,我們先簡單的想一下怎么才能實現Activity/Fragment生命周期函數的監聽?思考三秒鐘,聯想到上一篇中的做法,可以想到利用Fragment和Activity中添加的Fragment來感知宿主的生命周期。并且這里我們只需要監聽銷毀時候的函數就行。下面進行具體的分析。

ViewModel的實現過程

給出一個最簡單的創建的示例:

MainActivityViewModel viewModel=ViewModelProviders.of(this).get(MainActivityViewModel.class);

代碼很好理解,獲取當前類的ViewModel提供者,之后在傳入需要獲得的ViewModel的類型。先看一下ViewModelProviders都做了什么?

如果傳入的this是Fragment就先判斷下是否已經關聯到Activity上,沒有就拋異常。之后就初始化一個sDefaultFactory,用于創建ViewModelProvider。在ViewModelProvider的構造函數中還需要一個ViewModelStores。

兩個工廠方法用于創建ViewModelStore。接下來就是本文的重點了。還是以Activity為例,Fragment的大同小異。

簡單說一下這個方法都做什么了。先獲取FragmentManager,查找當前的Activity有沒有已經添加過HoldFragment,沒有的話則去還沒有添加到Activity/Fragment的HoldFragment列表中去查詢,看看有沒有已經創建的HoldFragment,只不過還沒有添加上去。如果還沒有的話那就創建一個新的HoldFragment,同時給Application注冊一個Activity的生命周期監聽,再把創建的HoldFragment添加到緩存列表中。現在來看看這個HoldFragment。

擁有兩個屬性sHoldFragmentManager和mViewStore。在onCreate方法中執行一個函數,將在未添加到Activity/Fragment的HoldeFragment列表中刪除當前的Activity/Fragment。然后在onDestory方法中調用mViewStore的clear方法,這里就會間接的調用到ViewModel的onCleared()方法。更多的細節可以去看源碼,這里簡單的總結一下都做了什么。

  1. 查找當前的Activity/Fragment中是否有已經添加的HoldFragment,有則返回。
  2. 查找當前的Activity/Fragment是否有已經創建但是并未添加的HoldFragment,有則返回。
  3. 注冊Activity/Fragment的生命周期監聽。
  4. 創建新的HoldeFragment,并添加的緩存列表。
  5. HoldFragment在關聯到Activity/Fragment之后會在緩存中去掉當前的Activity/Fragment對應的HoldFragment
  6. HoldFragment在onDestory的時候會調用其成員變量mViewStore的clear方法。

回到之前創建ViewModelProvider的地方。

簡單看一下,代碼不難理解,先賦值成員變量,之后是查看ViewModelStore中是否有傳入類型的ViewModel,沒有的話就通過傳入的工廠類創建一個新的ViewModel 添加到ViewModelStore中。

這樣ViewModel的實現過程就差不多結束了,還是利用Fragment的方式去獲取生命周期,然后再利用工廠類來創建ViewModel。

關于在一定范圍內的唯一性,因為ViewModelStore是HoldFragment的成員變量,HoldFragment是通過FragmentManager添加到指定的Activity/Fragment,那么對于當前的宿主,只有一個HoldFragment,也就只有一個ViewModelStore,同時也就只有一個ViewModel。

總結

同樣使用的給宿主添加Fragment的方式來獲取宿主的生命周期,只不過現在只獲取銷毀的函數就可以。然后在HoldFragment中持有一個集合用于保存當前宿主的ViewModel,在onDestory函數中調用集合的clear方法,間接調用到ViewModel的onCleared方法,實現生命周期的控制。同時使用TAG的方式添加Fragment
使得ViewModel相對宿主是唯一的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容