摘要:簡述漸漸的在開發道路上更注重的性能,數據的預加載的處理。那如何才能更好的處理這個問題呢那就需要我們開發人員自定義實現數據的緩加載。在這里實現數據的緩加載在,我增加了三個方法,一個是,即被設置為可見時調用,一個是,即被設置為不可見時調用。
簡述:
漸漸的在開發道路上更注重App的性能, 數據的預加載的處理。在日常開發APP,一個Activity里面有可能會是有Viewpager與多個Fragment來進行組合,而如果每個Fragment都需要通過網絡加載數據,或加載本地緩存。 如果當前Activity創建的時候就需要初始化大量的資源,需要網絡加載,從服務器loding。這樣的結果,我們也不會同意。那如何才能更好的處理這個問題呢? 那就需要我們開發人員自定義實現Fragment數據的緩加載。
答案:在Fragment里的setUserVisibleHint這個方法里
該方法用于告訴系統,這個Fragment的UI是否是可見的。所以我們只需要繼承Fragment并重寫該方法,即可實現在fragment可見時才進行數據加載操作,即Fragment的懶加載。
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里面就直接調用呢?
我這么寫是為了代碼的復用。因為在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就不往下執行。也就是僅當初始化完成,并且可見的時候才繼續加載,這樣的避免了未初始化完成就使用而帶來的問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73679.html
摘要:此時再次旋轉屏幕時,該不會被系統殺死和重建,只會調用。因此可通過和來判斷是否被重建,并取出數據進行恢復。但需要注意的是,在取出數據時一定要先判斷是否為空。只有在進程不被掉,正常情況下才會執行方法。 目錄介紹 1.0.0.1 說下Activity的生命周期?屏幕旋轉時生命周期?異常條件會調用什么方法? 1.0.0.2 后臺的Activity被系統回收怎么辦?說一下onSaveInsta...
閱讀 1966·2021-11-22 15:29
閱讀 3263·2021-10-14 09:43
閱讀 1229·2021-10-08 10:22
閱讀 3352·2021-08-30 09:46
閱讀 1438·2019-08-30 15:55
閱讀 1932·2019-08-30 15:44
閱讀 855·2019-08-30 14:19
閱讀 1451·2019-08-30 13:13