天天看點

Jetpack系列之ViewModel

省略相關背景介紹,直接進入主題。ViewModel 它是一個對Activity/Fragment 元件進行資料管理的。可以了解為一個資料管家,那麼日常的業務邏輯資料互動都可以在裡面實作,

也可以比喻為我們所知道的Presenter、或者Controller,不過它更強大,因為它是Google實作的,并且是響應式的,換句話說,Activty/Fragment銷毀了,他不一定銷毀,比我們的Activity是非正常銷毀,或者重建了,那麼這個ViewModel仍然活着,Activity重建之後可以繼續使用。但是如果我們的元件是自然的正常的銷毀,比如我按下傳回鍵、主動finish啥的,那麼ViewModel是會正常的銷毀的。是以這一點可以看出,ViewModel還是比較靈活的。

分析下Activity如何關聯這個ViewModel的,分析FragmentActivity代碼可以看出 它持有mViewModelStore,且ViewModelStore了解是一個Map結構。說明Activity内部擁有一個ViewModel的倉庫,我們建立的ViewModel會放在這個mViewModelStore倉庫中,這樣就完成了Activity和ViewModel的關聯。

分析下ViewModel是怎麼建立的,ViewModel的建立,google内部是一個工廠模式的實作,涉及到了ViewModelProviders、AndroidViewModelFactory等,不得不說,google大牛名字命名的真的好,望名知意,ViewModel建立之後會存儲到mViewModelStore中。

分析ViewModel如何感覺Activity銷毀的,既然ViewModel是Activity的資料管理者,那麼Activity如果銷毀了,還要你幹啥呢?,這不可以看到在FragmentActivity的onDestroy方法中,會回調mViewModelStore的clear方法,意思是清理所有的ViewModel,進而會回調ViewModel的clear方法,進而回調暴露給使用者的onCleared方法,那麼在此方法中,我們就可以進行一些資源回收操作。如取消網絡請求、回收資源啥的。

一點小思考,看源碼的時候,看到有個AndroidViewModel,就是說我們可以繼承ViewModel也可以繼承AndroidViewModel,顧名思義這個AndroidViewModel可以說是專為Android開發定制,這裡面還有Applicaiton,使用AndroidViewModel,我們就可以友善的擷取到Application然後拿到Context,為所欲為啦!

繼續閱讀