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