【Android】在Activity页面中如何实现Fragment数据的缓加载

简述:缓存

渐渐的在开发道路上更注重App的性能, 数据的预加载的处理。在平常开发APP,一个Activity里面有可能会是有Viewpager与多个Fragment来进行组合,而若是每一个Fragment都须要经过网络加载数据,或加载本地缓存。 若是当前Activity建立的时候就须要初始化大量的资源,须要网络加载,从服务器loding。这样的结果,咱们也不会赞成。那如何才能更好的处理这个问题呢? 那就须要咱们开发人员自定义实现Fragment数据的缓加载。bash

答案:在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里面就直接调用呢?ide

我这么写是为了代码的复用。由于在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就不往下执行。也就是仅当初始化完成,而且可见的时候才继续加载,这样的避免了未初始化完成就使用而带来的问题。ui

相关文章
相关标签/搜索