成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Android開發(fā)技巧】在Activity頁面中如何實現(xiàn)Fragment數(shù)據(jù)的緩加載

lwx12525 / 2194人閱讀

摘要:簡述漸漸的在開發(fā)道路上更注重的性能,數(shù)據(jù)的預加載的處理。那如何才能更好的處理這個問題呢那就需要我們開發(fā)人員自定義實現(xiàn)數(shù)據(jù)的緩加載。在這里實現(xiàn)數(shù)據(jù)的緩加載在,我增加了三個方法,一個是,即被設置為可見時調用,一個是,即被設置為不可見時調用。

簡述:

漸漸的在開發(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被設置為可見時調用,一個是onInvisible,即fragment被設置為不可見時調用。另外再寫了一個lazyLoad的抽象方法,該方法在onVisible里面調用。你可能會想,為什么不在getUserVisibleHint里面就直接調用呢?

我這么寫是為了代碼的復用。因為在fragment中,我們還需要創(chuàng)建視圖(onCreateView()方法),可能還需要在它不可見時就進行其他小量的初始化操作(比如初始化需要通過AIDL調用的遠程服務)等。而setUserVisibleHint是在onCreateView之前調用的,那么在視圖未初始化的時候,在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,用于標志是否初始化完成。然后在我們所需要的初始化操作完成之后調用,如上面的例子當中,在初始化view之后,設置 isPrepared為true,同時調用lazyLoad()方法。而在lazyLoad()當中,判斷isPrepared和isVisible只要有一個不為true就不往下執(zhí)行。也就是僅當初始化完成,并且可見的時候才繼續(xù)加載,這樣的避免了未初始化完成就使用而帶來的問題。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/73679.html

相關文章

  • 01.Android之基礎組件問題

    摘要:此時再次旋轉屏幕時,該不會被系統(tǒng)殺死和重建,只會調用。因此可通過和來判斷是否被重建,并取出數(shù)據(jù)進行恢復。但需要注意的是,在取出數(shù)據(jù)時一定要先判斷是否為空。只有在進程不被掉,正常情況下才會執(zhí)行方法。 目錄介紹 1.0.0.1 說下Activity的生命周期?屏幕旋轉時生命周期?異常條件會調用什么方法? 1.0.0.2 后臺的Activity被系統(tǒng)回收怎么辦?說一下onSaveInsta...

    iamyoung001 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<