【Android開發技巧】在Activity頁面中如何實現Fragment數據的緩加載

簡述:緩存

漸漸的在開發道路上更注重App的性能, 數據的預加載的處理。在平常開發APP,一個Activity裏面有可能會是有Viewpager與多個Fragment來進行組合,而若是每一個Fragment都須要經過網絡加載數據,或加載本地緩存。 若是當前Activity建立的時候就須要初始化大量的資源,須要網絡加載,從服務器loding。這樣的結果,咱們也不會贊成。那如何才能更好的處理這個問題呢? 那就須要咱們開發人員自定義實現Fragment數據的緩加載。服務器

答案:在Fragment裏的setUserVisibleHint這個方法裏網絡

該方法用於告訴系統,這個Fragment的UI是不是可見的。因此咱們只須要繼承Fragment並重寫該方法,便可實如今fragment可見時才進行數據加載操做,即Fragment的懶加載。ide

public abstract class LazyFragment extends Fragment {性能

protected boolean isVisible;  
/** 
 * 在這裏實現Fragment數據的緩加載. 
 * @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被設置爲可見時調用,一個是onInvisible,即fragment被設置爲不可見時調用。另外再寫了一個lazyLoad的抽象方法,該方法在onVisible裏面調用。你可能會想,爲何不在getUserVisibleHint裏面就直接調用呢?code

我這麼寫是爲了代碼的複用。由於在fragment中,咱們還須要建立視圖(onCreateView()方法),可能還須要在它不可見時就進行其餘小量的初始化操做(好比初始化須要經過AIDL調用的遠程服務)等。而setUserVisibleHint是在onCreateView以前調用的,那麼在視圖未初始化的時候,在lazyLoad當中就使用的話,就會有空指針的異常。而把lazyLoad抽離成一個方法,那麼它的子類就能夠這樣作:繼承

public class OpenResultFragment extends LazyFragment{資源

// 標誌位,標誌已經初始化完成。  
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;  
    }  
    //填充各控件的數據  
}

}
在上面的類當中,咱們增長了一個標誌位isPrepared,用於標誌是否初始化完成。而後在咱們所須要的初始化操做完成以後調用,如上面的例子當中,在初始化view以後,設置 isPrepared爲true,同時調用lazyLoad()方法。而在lazyLoad()當中,判斷isPrepared和isVisible只要有一個不爲true就不往下執行。也就是僅當初始化完成,而且可見的時候才繼續加載,這樣的避免了未初始化完成就使用而帶來的問題。開發

相關文章
相關標籤/搜索