1
Fragment 懶加載是什么意思嘲碱?
所謂懶加載,即Fragment 的 UI 對用戶可見時才加載數(shù)據(jù)。
以前我沒啥經(jīng)驗(yàn),一股腦的從服務(wù)器拉取數(shù)據(jù)之后立馬把數(shù)據(jù)綁定到 Fragment 的 UI 組件上单鹿,可能不符合部分產(chǎn)品的需求。
那么懶加載的技術(shù)關(guān)鍵點(diǎn)是什么深纲?
根據(jù)定義:
所謂懶加載仲锄,即Fragment 的 UI 對用戶可見時才加載數(shù)據(jù)。
需要判斷何時 Fragment 的 UI 才對用戶可見湃鹊。
如何判斷 Fragment 的 UI 是否對用戶可見儒喊?
Fragment 提供了一個方法 public void setUserVisibleHint(boolean isVisibleToUser),API 的注釋如下:
Set a hint to the system about whether this fragment's UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore.
所以币呵,只需要判斷參數(shù) isVisibleToUser 是否為 True 即可知道該 Fragment 的 UI 是否對用戶可見怀愧。
setUserVisibleHint 在什么時候調(diào)用?
對于單個 Fragment富雅,setUserVisibleHint 是不會被調(diào)用的掸驱,只有該 Fragment 在 ViewPager 里才會被調(diào)用。所以没佑,我寫了一個 ViewPager + Fragment 的 Demo毕贼,打印了一下 Log可以看到 setUserVisibleHint 的執(zhí)行順序如下:
setUserVisibleHint: isVisibleToUser = false
onAttach
onCreate
setUserVisibleHint: isVisibleToUser = true
onCreateView
onActivityCreated
onStart
onResume
onPause
onStop
onDestroyView
onDestroy
onDetach
2
代碼
為了方便,封裝一個基類 LazyLoadFragment蛤奢,提供一個 loadData() 方法供調(diào)用去加載數(shù)據(jù)
等等鬼癣,為什么 loadData() 會在兩個地方執(zhí)行?
在 setUserVisibleHint 方法里執(zhí)行我還能理解啤贩,為什么 onActivityCreated 也要執(zhí)行呢待秃?
因?yàn)椋琕iewPager 默認(rèn)顯示第一頁痹屹,第一頁肯定要先加載數(shù)據(jù)啊章郁,而且 setUserVisibleHint 的執(zhí)行順序又是在 onCreatView 之前,同時 onCreatView 需要初始化界面和修改 isViewCreated 的值。所以就需要在 onActivityCreated 里執(zhí)行一次咯暖庄。
3
wait...
文章寫到這里聊替,我聽到了一個不同的聲音
ViewPager 不是有 setOffscreenPageLimit(int limit) 方法嗎?我調(diào)用 viewPager.setOffscreenPageLimit(0) 不就行了嗎培廓?
我想說:思路是對的惹悄,但是這樣做沒效果。為什么肩钠?看一下 setOffscreenPageLimit 的方法實(shí)現(xiàn)就知道了
limit 默認(rèn)為 1 泣港,就算傳一個 0 也無濟(jì)于事啊。(ps:留言下方有人提出可以修改ViewPager源碼)
本文總結(jié)
懶加載的技術(shù)關(guān)鍵點(diǎn)
setUserVisibleHint 的執(zhí)行順序
為什么 ViewPager.setOffscreenPageLimit(0) 無效价匠?