用多viewpager+fragment的朋友都知道viewpager有預(yù)加載機(jī)制草慧,如果你每個(gè)頁面都有請(qǐng)求網(wǎng)絡(luò)的操作羽戒,那么只顯示第一個(gè)頁面就去加載完所有頁面的網(wǎng)絡(luò)數(shù)據(jù)也不好及皂。那怎么辦呢弦赖,有的朋友說那就不用viewpager,那更不行彬伦,物品就是因?yàn)閂iewpager有緩存機(jī)制才用它的。于是我們換種思路伊诵,在fragment上動(dòng)手腳单绑,所以就有了懶加載這個(gè)說法。
其實(shí)懶加載的核心來自與fragment中的一個(gè)方法setUserVisibleHint曹宴,這個(gè)方法只有在從隱藏到顯示和從顯示到隱藏才會(huì)調(diào)用搂橙,而getUserVisibleHint()這個(gè)方法能返回顯示/隱藏狀態(tài)。
之前我在網(wǎng)上找了一些別人寫的笛坦,很多都寫得看著不是很好区转,但是我找到了一個(gè)寫得挺不錯(cuò)的,比較符合viewpager+fragment這種情況版扩。
public abstract class BaseLazyFragment extends BaseFragment {
/**
* 懶加載過
*/
private boolean isLazyLoaded;
private boolean isPrepared;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;
//只有Fragment onCreateView好了蜗帜,
//另外這里調(diào)用一次lazyLoad()
lazyLoad();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
lazyLoad();
}
/**
* 調(diào)用懶加載
*/
private void lazyLoad() {
if (getUserVisibleHint() && isPrepared && !isLazyLoaded) {
onLazyLoad();
isLazyLoaded = true;
}
}
@UiThread
public abstract void onLazyLoad();
}
這是他寫的代碼,要判斷是否請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)有三個(gè)條件资厉,是否第一次加載厅缺,是否是顯示狀態(tài)和基本組件是否已經(jīng)初始化完成。
他的寫法和我所想的思路一樣宴偿,那我就不再花時(shí)間自己封一個(gè)湘捎,就用這個(gè)代碼來講。
首先肯定只有第一次顯示才請(qǐng)求網(wǎng)絡(luò)吧窄刘,之后再顯示都不請(qǐng)求窥妇,所以要在第一次請(qǐng)求網(wǎng)絡(luò)之后吧isLazyLoaded變?yōu)閠rue。
然后對(duì)于第一個(gè)頁面來說娩践,setUserVisibleHint是在onActivityCreated方法之前活翩,所以要在onActivityCreated方法中再進(jìn)行一次請(qǐng)求網(wǎng)絡(luò)的操作烹骨。
這樣講應(yīng)該能明白這段代碼的意思。其實(shí)做法有很多種材泄,不一定要這樣寫沮焕,但是思路我覺得就是這樣。