Fragment的懶加載
我們?cè)谧鰬?yīng)用開發(fā)的時(shí)候,一個(gè)Activity里面可能會(huì)以viewpager(或其他容器)與多個(gè)Fragment來組合使用,而如果每個(gè)fragment都需要去加載數(shù)據(jù),或從本地加載,或從網(wǎng)絡(luò)加載,那么在這個(gè)activity剛創(chuàng)建的時(shí)候就變成需要初始化大量資源。這樣的結(jié)果,我們當(dāng)然不會(huì)滿意。那么,能不能做到當(dāng)切換到這個(gè)fragment的時(shí)候,它才去初始化呢?
答案就在Fragment里的setUserVisibleHint這個(gè)方法里。請(qǐng)看關(guān)于Fragment里這個(gè)方法的API文檔(國內(nèi)鏡像地址:http://zdz.la/YrpKlu):
該方法用于告訴系統(tǒng),這個(gè)Fragment的UI是否是可見的。所以我們只需要繼承Fragment并重寫該方法,即可實(shí)現(xiàn)在fragment可見時(shí)才進(jìn)行數(shù)據(jù)加載操作,即Fragment的懶加載。
代碼如下:
在LazyFragment,我增加了三個(gè)方法,一個(gè)是onVisiable,即fragment被設(shè)置為可見時(shí)調(diào)用,一個(gè)是onInvisible,即fragment被設(shè)置為不可見時(shí)調(diào)用。另外再寫了一個(gè)lazyLoad的抽象方法,該方法在onVisible里面調(diào)用。你可能會(huì)想,為什么不在getUserVisibleHint里面就直接調(diào)用呢?
我這么寫是為了代碼的復(fù)用。因?yàn)樵趂ragment中,我們還需要?jiǎng)?chuàng)建視圖(onCreateView()方法),可能還需要在它不可見時(shí)就進(jìn)行其他小量的初始化操作(比如初始化需要通過AIDL調(diào)用的遠(yuǎn)程服務(wù))等。而setUserVisibleHint是在onCreateView之前調(diào)用的,那么在視圖未初始化的時(shí)候,在lazyLoad當(dāng)中就使用的話,就會(huì)有空指針的異常。而把lazyLoad抽離成一個(gè)方法,那么它的子類就可以這樣做:
在上面的類當(dāng)中,我們?cè)黾恿艘粋€(gè)標(biāo)志位isPrepared,用于標(biāo)志是否初始化完成。然后在我們所需要的初始化操作完成之后調(diào)用,如上面的例子當(dāng)中,在初始化view之后,設(shè)置 isPrepared為true,同時(shí)調(diào)用lazyLoad()方法。而在lazyLoad()當(dāng)中,判斷isPrepared和isVisible只要有一個(gè)不為true就不往下執(zhí)行。也就是僅當(dāng)初始化完成,并且可見的時(shí)候才繼續(xù)加載,這樣的避免了未初始化完成就使用而帶來的問題。
在這里我對(duì)fragment的懶加載實(shí)現(xiàn)的介紹就到此為止,如果你有興趣,可以基于此再深入探究,比如寫一個(gè)帶有緩初始化和可見時(shí)刷新的特性的Fragment。
推薦文章
2025-01-18
2024-11-28
2024-11-09
2024-10-25
2024-06-25
2024-01-04
2023-11-06
2023-10-30
2023-10-13
2023-10-10
穩(wěn)定
產(chǎn)品高可用性高并發(fā)貼心
項(xiàng)目群及時(shí)溝通專業(yè)
產(chǎn)品經(jīng)理1v1支持快速
MVP模式小步快跑承諾
我們選擇聲譽(yù)堅(jiān)持
10年專注高端品質(zhì)開發(fā)聯(lián)系我們
友情鏈接: