線上服務(wù)咨詢
Article/文章
記錄成長(zhǎng)點(diǎn)滴 分享您我感悟
您當(dāng)前位置>首頁(yè) > 知識(shí) > 網(wǎng)站建設(shè)
延遲加載片段
發(fā)表時(shí)間:2019-07-30 16:04:01
文章來(lái)源:沈陽(yáng)軟件開(kāi)發(fā)
標(biāo)簽:網(wǎng)站建設(shè) 小程序開(kāi)發(fā) 小程序制作 微信小程序開(kāi)發(fā) 公眾號(hào)開(kāi)發(fā) 微信公眾號(hào)開(kāi)發(fā) 網(wǎng)頁(yè)設(shè)計(jì) 網(wǎng)站優(yōu)化 網(wǎng)站排名 網(wǎng)站設(shè)計(jì) 微信小程序設(shè)計(jì) 小程序定制 微信小程序定制
瀏覽次數(shù):0
當(dāng)我們進(jìn)行應(yīng)用程序開(kāi)發(fā)時(shí),Activity可以將viewpager(或其他容器)與多個(gè)Fragment結(jié)合使用,如果每個(gè)片段需要加載數(shù)據(jù),在本地加載,或從網(wǎng)絡(luò)加載,那么當(dāng)這個(gè)活動(dòng)只是創(chuàng)建后,有必要初始化大量資源。當(dāng)然,我們不會(huì)對(duì)這個(gè)結(jié)果感到滿意。那么,切換到這個(gè)片段時(shí)可以初始化嗎?
答案在Fragment的setUserVisibleHint方法中。請(qǐng)?jiān)贔ragment中查看此方法的API文檔(國(guó)內(nèi)圖片地址:http://zdz.la/YrpKlu):
[普通]視圖plaincopySetahinttothesystemaboutwhetherthisfragment'sUIiscurrentlyvisibletotheuser.Thishintdefaultstotrueandispersistentacrossfragmentinstancestatesaveandrestore.Anappmaysetthistofalsetoindicatethatthefragment'sUIisscrolledoutofvisibilityorisotherwisenotdirectlyvisibletotheuser.Thismaybeusedbythesystemtoprioritizeoperationssuchasfragmentlifecycleupdatesorloaderorderingbehavior.ParametersisVisibleToUsertrueifthisfragment'sUIiscurrentlyvisibletotheuser(默認(rèn)值),falseifitisnot。此方法用于告知系統(tǒng)此片段的UI是否可見(jiàn)。因此我們只需要繼承Fragment并重寫(xiě)該方法,以便在片段可見(jiàn)時(shí)執(zhí)行數(shù)據(jù)加載操作,即片段的延遲加載。
代碼如下:
[java] view plaincopy/** Date: 14-7-17 * Project: Access-Control-V2 */packagecn.irains.access_control_v2.common; importandroid.support.v4.app.Fragment;/***作者: msdx (645079761@qq.com)*時(shí)間: 14-7-17 PM 5: 46 */publicabstractclassLazyFragmentextendsFragment {protectedbooleanisVisible;/***在此處實(shí)現(xiàn)片段數(shù)據(jù)的緩慢加載。* @ paramisVisibleToUser */@ OverridepublicvoidsetUserVisibleHint(booleanisVisibleToUser){super。 setUserVisibleHint(isVisibleToUser);如果(getUserVisibleHint()){ISVISIBLE=TRUE; onVisible();}其他{ISVISIBLE=FALSE; onInvisible();}} protectedvoidonVisible(){lazyLoad();} protectedabstractvoidlazyLoad(); protectedvoidonInvisible() 在LazyFragment中,我添加了三個(gè)方法,一個(gè)是onVisiable,當(dāng)fragment設(shè)置為visible時(shí)調(diào)用,一個(gè)是onInvisible,當(dāng)fragment設(shè)置為不可見(jiàn)時(shí)調(diào)用。還寫(xiě)了一個(gè)lazyLoad的抽象方法,在onVisible中調(diào)用。您可能會(huì)想,為什么不直接在getUserVisibleHint中調(diào)用它?我寫(xiě)這個(gè)代碼重用。因?yàn)樵谄沃?,我們還需要?jiǎng)?chuàng)建一個(gè)視圖(onCreateView()方法),并且當(dāng)它不可見(jiàn)時(shí)可能需要執(zhí)行其他小的初始化操作(例如初始化需要通過(guò)AIDL調(diào)用的遠(yuǎn)程服務(wù))。在onCreateView之前調(diào)用setUserVisibleHint,然后在未初始化視圖時(shí),如果在lazyLoad中使用,則會(huì)出現(xiàn)空指針異常。通過(guò)將lazyLoad拉入方法,其子類可以執(zhí)行此操作:
[java] view plaincopypublicclassOpenResultFragmentextendsLazyFragment {//flag,該標(biāo)志已初始化。 privateBooleanisPrepared; @OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Log.d(LOG_TAG,'onCreateView'); Viewview=inflater.inflate(R.layout.fragment_open_result,container,false); //XXX初始化視圖控件isPrepared=True ; lazyLoad(); returnview;} @ OverrideprotectedvoidlazyLoad(){if(!isPrepared ||!isVisible){return;} //填寫(xiě)每個(gè)控件的數(shù)據(jù)}}在上面的類中,我們添加了一個(gè)標(biāo)志isPrepared來(lái)指示初始化是否完成。然后,在我們需要的初始化操作完成之后,如上例所示,在初始化視圖之后,將isPrepared設(shè)置為true并調(diào)用lazyLoad()方法。在lazyLoad()中,確定只要一個(gè)不為真,就不會(huì)執(zhí)行isPrepared和isVisible。也就是說(shuō),只有在初始化完成并且可見(jiàn)時(shí)才繼續(xù)加載,這避免了由于使用未初始化而引起的問(wèn)題。
這里我介紹片段延遲加載的實(shí)現(xiàn)。如果您感興趣,可以基于此進(jìn)一步探索它,例如編寫(xiě)具有緩慢初始化和可見(jiàn)刷新的片段。
標(biāo)簽:& nbsp& nbspapp開(kāi)發(fā)和應(yīng)用程序設(shè)計(jì)& nbspFragment延遲加載網(wǎng)站建設(shè),小程序開(kāi)發(fā),小程序制作,微信小程序開(kāi)發(fā),公眾號(hào)開(kāi)發(fā),微信公眾號(hào)開(kāi)發(fā),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站優(yōu)化,網(wǎng)站排名,網(wǎng)站設(shè)計(jì),微信小程序設(shè)計(jì),小程序定制,微信小程序定制