1. 程式人生 > >Android系列Viewpager+Fragment 優化之懶載入(預載入)的實現

Android系列Viewpager+Fragment 優化之懶載入(預載入)的實現

今天帶來的就是fragment的優化,怎麼去實現懶載入

懶載入(預載入)

懶載入字面意思就是當需要的時候才會去載入,不需要就不要載入

為什麼Fragment需要懶載入呢,一般我們都會在onCreate()或者onCreateView()裡去啟動一些資料載入操作,比如從本地載入或者從伺服器載入。大部分情況下,這樣並不會出現什麼問題,但是當你使用ViewPager + Fragment的時候,問題就來了,這時就應該考慮是否需要實現懶載入了。

優點

1.支援資料的懶載入並且只加載一次

2.提供 Fragment 可見與不可見時回撥,支援你在這裡進行一些 ui 操作,如顯示/隱藏載入框

3.支援 view 的複用,防止與 ViewPager 使用時出現重複建立 view 的問題

示例

我們知道viewpager加fragment的組合是很多app展示的方式,我們以載入四個fragment為例,預設viewpager中,首次進來就會初始化2個fragment,通過呼叫方法,甚至可以在首次進來的時候能一次性初始化四個fragment,我們知道很多頁面的網路請求都在fragment中初始化的時候就開始了,所以如果不需要開啟的頁面也會去進行網路載入,無疑會造成使用者體驗不好,今天這篇部落格帶來的就是怎麼去實現懶載入,在使用者滑到這個fragment的時候再去初始化fragment。

我們一般會抽取一個BaseFragment去作為基類,在這個基類中進行一系列的程式碼書寫 去判斷當前fragment是不是首次載入 先上程式碼

那麼如何使用呢?

在需要繼承的子類中 重寫  onFragmentFirstVisible() 方法 然後在這個方法中進行網路請求 資料的載入 或者其他一些初始化工作 這樣就能實現Fragment的懶載入

原理

要實現懶載入 必須需要了解一個方法

setUserVisibleHint(boolean isVisibleToUser) 

當你去網上查詢相關資料時,你會發現很多人推薦說把載入資料的操作放在這個函式裡,isVisibleToUser表示當前Fragment是否可見。那麼,是否真的可以就這樣做呢?我們看個日誌:

那麼,是否可以在setUserVisibleHint(boolean isVisibleToUser)

裡進行資料載入操作來實現懶載入呢?

可以是可以,如果你只是需要資料的懶載入的話,但如果你還有以下的需求,那麼這種方式就不行了:

1、如果你在Fragment可見時需要進行一些控制元件的操作,比如顯示載入控制元件

2、如果你還需要在Fragment從 “可見 -> 不可見” 時進行一些操作的話,比如取消載入控制元件顯示

注意:setUserVisibleHint()可能會在Fragment的生命週期之外被呼叫,也就是可能在view建立前就被呼叫,也可能在destroyView後被呼叫,所以如果涉及到一些控制元件的操作的話,可能會報 null 異常,因為控制元件還沒初始化,或者已經摧毀了。

注意:

如果想要讓 fragment 的佈局複用成功,需要重寫 viewpager 的介面卡裡的 destroyItem() 方法,將 super 去掉,也就是不銷燬 view。

如果出現切換回來或不相鄰的Tab切換時導致空白介面的問題,解決方法:在 onCreateView中複用佈局 + ViewPager 的介面卡中複寫 destroyItem() 方法去掉 super。