Fragment懒加载机制

来源:互联网 发布:淘宝网服装女装秋装 编辑:程序博客网 时间:2024/06/06 16:31

把Fragment放到Viewpager的时候,由于FragmentPagerAdapter缓存的原因,它会创建当前的Fragment和当前旁边两个的fragment。看下图这里写图片描述
当我一进入这个页面的时候,当前页是“”全部“Fragment,左边没有,右边有一个“简餐便当”Fragment,它也会加载出来

07-21 16:24:27.945 23014-23014/? V/mytextframent全部: onCreate07-21 16:24:27.945 23014-23014/? V/mytextframent全部: onCreateView07-21 16:24:28.385 23014-23014/? V/mytextframent全部: onResume07-21 16:24:28.385 23014-23014/? V/mytextframent简餐便当: onCreate07-21 16:24:28.385 23014-23014/? V/mytextframent简餐便当: onCreateView07-21 16:24:28.825 23014-23014/? V/mytextframent简餐便当: onResume

很多时候,我们就把Fragment里的网络数据放在onCreate()或者 onCreateView()函数里去了,这样的话,可能还没有切换到当前页面的Fragment的数据也就加载好了,这样的坏处有:
1.可能用户根本就不会点到那个未加载的Fragment页面去,你却偷偷的给人家加载数据了,这不是浪费人家的流量么。
2.如果同时有3个页面都去加载网络数据,一般加载完数据还有更新界面操作,这样很容易导致页面卡顿,特别是还有用户会快速的滑动Viewpager,这样卡顿会更明显。
所以,为了消灭这种偷偷加载数据的行为,我们就要有这个懒加载机制。
懒加载机制:当切换到当前页面的时候,就加载本页面的数据,其他页面不加载。
下面我们就一步一步来完善这个懒加载。
Fragment有一个重载方法 public void setUserVisibleHint(boolean isVisibleToUser);
这个方法在当Fragment切换到当前页面的时候会被调用,并且isVisibleToUser为true,所以我们的网络记载操作可以放在这个方法里,
而且这里还要设一个已经发起过网络加载操作的标志loaddata,防止多次切换本页面到当前页而导致多次加载网络数据。

boolean loaddata=false;  @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(isVisibleToUser&&!loaddata){                   loaddata=true;                   //网络操作        }    }

这样似乎就解决了懒加载问题,这也是网上大多数人推荐的写法,但你跑起应用的时候会发现等了半天也没数据,这是怎么回事?不知道那些人自己有没有写例子
这是因为当第一次创建Fragment的时候,setUserVisibleHint(boolean isVisibleToUser)这个方法没有被调用。
即使它被切换到当前的fragment。那这该怎么办呢?
我的方法是网络操作是onCreateView()这个重载方法中也要合适的进行网络加载的操作。
用一些变量对它进行控制

boolean loadata=false;    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        if(contextView==null){            contextView = inflater.inflate(R.layout.headfragment_layout, container, false);        }     if(contextView!=null&&getUserVisibleHint()&&!loadata){              loaddata=true;              //网络操作     }        return  contextView;    }

只要Fragment没有被切换到可见状态,getUserVisibleHint()的返回值就会为false,就算创建了这个Fragment,如果没有被切换到前台也是不会进行网络操作的。

原创粉丝点击