zoukankan      html  css  js  c++  java
  • Fragment的setUserVisibleHint方法实现懒加载

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

    在这里我对fragment的懒加载实现的介绍就到此为止,如果你有兴趣,可以基于此再深入探究,比如写一个带有缓初始化和可见时刷新的特性的Fragment。

      

     

  • 相关阅读:
    hdu1231 最大连续子序列
    Android 大众点评的接入
    Android Volley分析(一)——结构
    数字签名与数字证书技术简单介绍(一)
    HDU-3681-Prison Break(BFS+状压DP+二分)
    TNS-01201: Listener cannot find executablen 错误
    Android学习笔记(20)————利用ListView制作带竖线的多彩表格
    ListView美化:去阴影、底色、选中色
    android 用ListView实现表格样式
    Android播播放完SD卡指定文件夹音乐之后,自动播放下一首
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6690968.html
Copyright © 2011-2022 走看看