国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android優(yōu)化方案之Fragment的懶加載實(shí)現(xiàn)代碼

2019-10-22 18:14:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、背景

Android應(yīng)用中,ViewPager是我們不可避免使用的一個(gè)控件,因?yàn)樗梢允刮覀冊(cè)谡加幂^少空間的同時(shí),增強(qiáng)內(nèi)容的豐富性,同時(shí)以其內(nèi)部流淌著Google的血液,所以它幾乎成了每一個(gè)App的標(biāo)配控件。但是,假如ViewPager的每一個(gè)Fragment都需要通過(guò)網(wǎng)絡(luò)拉取數(shù)據(jù)加載,而ViewPager是默認(rèn)加載前兩項(xiàng)的,所以在很容易造成網(wǎng)絡(luò)丟包或者網(wǎng)絡(luò)堵塞等問(wèn)題,所以Fragment使用懶加載是非常有必要的。

舉個(gè)栗子:

Android,Fragment,懶加載,代碼

如上圖所示,我們有兩個(gè)大的Tab:人物和風(fēng)景。而人物Tab下有三個(gè)Tab:美女、帥哥、萌娃三個(gè)Tab,風(fēng)景Tab下有:北京、香港、上海三個(gè)Tab。假如當(dāng)App剛啟動(dòng)時(shí),執(zhí)行的生命周期如下:

Android,Fragment,懶加載,代碼

我們可以看到,App會(huì)默認(rèn)加載美女和帥哥兩個(gè)Fragment,并且它們的生命周期都執(zhí)行到onStar()方法,同時(shí)加載兩個(gè)Fragment,假如我們?cè)贔ragment加載的時(shí)候拉取網(wǎng)絡(luò)數(shù)據(jù),那么就會(huì)造成如上所說(shuō)的網(wǎng)絡(luò)丟包或者網(wǎng)絡(luò)堵塞等問(wèn)題,所以我們?yōu)榱吮苊膺@個(gè)問(wèn)題,就需要實(shí)現(xiàn)Fragment的懶加載,當(dāng)我們對(duì)Fragment可見(jiàn)的時(shí)候,再進(jìn)行網(wǎng)絡(luò)加載數(shù)據(jù)。

二、實(shí)現(xiàn)Fragment懶加載

針對(duì)背景討論的問(wèn)題,我們最終要實(shí)現(xiàn)的目標(biāo)就是,當(dāng)Fragment對(duì)我們可見(jiàn)時(shí),我們才進(jìn)行網(wǎng)絡(luò)加載,然后再解析數(shù)據(jù),更新UI。針對(duì)上面的Demo,我們需要做到如下效果:

Android,Fragment,懶加載,代碼

要實(shí)現(xiàn)起來(lái)其實(shí)也并不復(fù)雜,在Fragment中有一個(gè)setUserVisibleHint這個(gè)方法,而且這個(gè)方法是優(yōu)于onCreate()方法的,所以也可以作為Fragment的一個(gè)生命周期來(lái)看待,它會(huì)通過(guò)isVisibleToUser告訴我們當(dāng)前Fragment我們是否可見(jiàn),我們可以在可見(jiàn)的時(shí)候再進(jìn)行網(wǎng)絡(luò)加載。

public void setUserVisibleHint(boolean isVisibleToUser)

當(dāng)我們?cè)?code>setUserVisibleHint方法中進(jìn)行Log輸出時(shí),我們可以看到:

Android,Fragment,懶加載,代碼

只有可見(jiàn)時(shí),我們isVisibleToUser為true,否則為false。所以我們可以重寫(xiě)setUserVisibleHint方法,然后在可見(jiàn)時(shí)進(jìn)行網(wǎng)絡(luò)加載數(shù)據(jù):

@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {  Log.d("TAG", mTagName + " setUserVisibleHint() --> isVisibleToUser = " + isVisibleToUser);  if (isVisibleToUser) {    pullData();  }  super.setUserVisibleHint(isVisibleToUser);}

三、根據(jù)實(shí)際用途使用懶加載

由第二部分我們可以知道,setUserVisibleHint(boolean isVisibleToUser)方法是比onCreate更早調(diào)用的,但是我們一般在加載數(shù)據(jù)時(shí),都會(huì)在數(shù)據(jù)加載完成時(shí)進(jìn)行UI更新,所以這就有了一個(gè)問(wèn)題,假如拉取數(shù)據(jù)是秒回,但是我們還沒(méi)有進(jìn)行UI綁定,或者是Adapter初始化等,那么我們就無(wú)法更新UI了,所以Fragment給我們提供了另一個(gè)方法getUserVisibleHint(),它就是用來(lái)判斷當(dāng)前Fragment是否可見(jiàn),所以我們就可以在一系列變量初始化完成后再判斷是否可見(jiàn),若可見(jiàn)再進(jìn)行數(shù)據(jù)拉?。?/p>

@Overridepublic void onStart() {  super.onStart();  Log.d("TAG", mTagName + " onStart()");  ...  if(getUserVisibleHint()) {    pullData();  }}

當(dāng)然,如果你的網(wǎng)絡(luò)請(qǐng)求并不需要涉及UI更新,那么就可以直接在setUserVisibleHint(boolean isVisibleToUser)里操作,所以最終還是要根據(jù)各自的實(shí)際用途來(lái)使用。

最后,附上懶加載的Demo:Github/LazyFragment

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安泽县| 武冈市| 怀集县| 汨罗市| 封开县| 景泰县| 哈巴河县| 普兰县| 平定县| 万安县| 定远县| 松阳县| 长海县| 宿州市| 阜城县| 丹凤县| 阿尔山市| 秀山| 中方县| 关岭| 朔州市| 蒙城县| 大港区| 时尚| 珲春市| 隆安县| 怀集县| 乌什县| 南部县| 宝兴县| 永福县| 吉林省| 蒙自县| 平江县| 全州县| 林周县| 崇信县| 六盘水市| 涞源县| 桐庐县| 开封市|