簡述:
漸漸的在開發(fā)道路上更注重App的性能, 數(shù)據(jù)的預加載的處理。在日常開發(fā)APP,一個Activity里面有可能會是有Viewpager與多個Fragment來進行組合默穴,而如果每個Fragment都需要通過網(wǎng)絡加載數(shù)據(jù),或加載本地緩存褪秀。 如果當前Activity創(chuàng)建的時候就需要初始化大量的資源蓄诽,需要網(wǎng)絡加載,從服務器loding媒吗。這樣的結果仑氛,我們也不會同意。那如何才能更好的處理這個問題呢蝴猪? 那就需要我們開發(fā)人員自定義實現(xiàn)Fragment數(shù)據(jù)的緩加載调衰。
答案:在Fragment里的setUserVisibleHint這個方法里
該方法用于告訴系統(tǒng),這個Fragment的UI是否是可見的自阱。所以我們只需要繼承Fragment并重寫該方法嚎莉,即可實現(xiàn)在fragment可見時才進行數(shù)據(jù)加載操作,即Fragment的懶加載沛豌。
public abstract class LazyFragment extends Fragment {
protected boolean isVisible;
/**
* 在這里實現(xiàn)Fragment數(shù)據(jù)的緩加載.
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible(){
lazyLoad();
}
protected abstract void lazyLoad();
protected void onInvisible(){}
}
在LazyFragment趋箩,我增加了三個方法,一個是onVisiable加派,即fragment被設置為可見時調(diào)用叫确,一個是onInvisible,即fragment被設置為不可見時調(diào)用芍锦。另外再寫了一個lazyLoad的抽象方法竹勉,該方法在onVisible里面調(diào)用。你可能會想娄琉,為什么不在getUserVisibleHint里面就直接調(diào)用呢次乓?
我這么寫是為了代碼的復用。因為在fragment中孽水,我們還需要創(chuàng)建視圖(onCreateView()方法)票腰,可能還需要在它不可見時就進行其他小量的初始化操作(比如初始化需要通過AIDL調(diào)用的遠程服務)等。而setUserVisibleHint是在onCreateView之前調(diào)用的女气,那么在視圖未初始化的時候杏慰,在lazyLoad當中就使用的話,就會有空指針的異常。而把lazyLoad抽離成一個方法缘滥,那么它的子類就可以這樣做:
public class OpenResultFragment extends LazyFragment{
// 標志位轰胁,標志已經(jīng)初始化完成。
private boolean isPrepared;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(LOG_TAG, "onCreateView");
View view = inflater.inflate(R.layout.fragment_open_result, container, false);
//XXX初始化view的各控件
isPrepared = true;
lazyLoad();
return view;
}
@Override
protected void lazyLoad() {
if(!isPrepared || !isVisible) {
return;
}
//填充各控件的數(shù)據(jù)
}
}
在上面的類當中朝扼,我們增加了一個標志位isPrepared软吐,用于標志是否初始化完成。然后在我們所需要的初始化操作完成之后調(diào)用吟税,如上面的例子當中,在初始化view之后姿现,設置 isPrepared為true肠仪,同時調(diào)用lazyLoad()方法。而在lazyLoad()當中备典,判斷isPrepared和isVisible只要有一個不為true就不往下執(zhí)行异旧。也就是僅當初始化完成,并且可見的時候才繼續(xù)加載提佣,這樣的避免了未初始化完成就使用而帶來的問題吮蛹。
在這里我對fragment的懶加載實現(xiàn)的介紹就到此為止。