fragment优化数据加载—懒加载

1.fragment 作为碎片加入FragmentActivity中,却可以在单独的自己的Fragment中处理自己的数据及其页面显示

2.无论是FragmentActivity通过add方法,还是通过Viewpager的形式来引入fragment,都会涉及到多个fragment和不同fragment页面的数据加载

同时,显示的fragment的加入activity和显示的ui上顺序是不同的。

1.add方法,是要先实例化你要添加的Fragment 例如。MyFragment mfgt  = new MyFragment(); 然后add到界面中,如果你这个Activity中要放入多个fragment,

那么就要new 出多个对象,然后放入到activity中,从中可以看到mfgt  是最先放到界面上的,那么就会最先显示这个界面,那么这个fragment的数据也就会随着加载。

虽然其他的fragment 被hide(),等你show()的时候才能看得到,但是他的数据已经请求过了,并不是你看的时候才会去请求显示的。也就是说,一下子有好多的数据

请求,即使没显示,可能用户根本故关心的界面数据都进行了请求,浪费流量、增加服务器压力、客户端做了不必要的操作,降低体验的速度

2.第二种是通过viewpager的方式,返回一个个fragment实例。显示在界面上,vp的默认缓存是3个页面,也就是说,你在第2个页面,其实,第1.3这两个界面已经去自动

去获取数据,这样就发生了和add一样的尴尬。

3.那么有没有一种方法能够做到我显示那个fragment,我就只做这一个fragment的页面数据请求的呢?答案是肯定的,可以!

那就是fragment的懒加载:

  //用于延迟切换,可用于界面出现之后的刷新显示
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        // TODO Auto-generated method stub
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
//       Log.e("fragment切换", folderName);
        }
    }
google,已经为我们提供了这个方法,来判断是哪个fragment显示在当前界面,我们只需要在boolean 返回值是true的时候,进行数据请求和页面刷新就可以了。

4.真的如上所述万事无忧了,NONONNO,如果你都把数据请求都放在这里,那么在FragmentActivity就会显示空指针了,这时候的空指针是没有找到相应的第一放入

fragmentActivity中的fragment 的view里面的控件,为什么呢?因为setUserVisibleHint()这个方法的调用是在OnCreateView()之前的,而fragment显示的VIew是在onCreateVIew()这个方法里返回的,那么该怎么办呢?可以在Fragment中,设置一个boolean  isCanLoading = false;值,如下

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.e("测试生命周期", "运行Main");
    mMainfgt = inflater.inflate(R.layout.main_fgt, container, false);
    dealLogicAfterOnCreate();
    initView();
    initListener();
    initData();
    isCanLoading = true;
    onLoadingForData();
    return mMainfgt;
}

然后,系统方法中,我们定义的判断条件在加上一个

 //用于延迟切换,可用于界面出现之后的刷新显示
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        // TODO Auto-generated method stub
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isCanLoading) {
//       Log.e("fragment切换", folderName);
        }
    }

这样就可以,做到不会出现空指针异常了。

5.那么我们再考虑考虑还会出现什么问题呢?其实还有一个问题,就是,在用setUserVisbleHint方法来判断当前fragment是不是显示,有一个重要的前提,就是,你必须用这个fragment.setUserVisbleHint(true)之后才能得到数值,在fragment中重写了这个方法才会生效,要不然是不会运行到这里面的。那么有人会说了,我的就不用,都可以用,那么你用的一定是viewpager+fragment ,因为viewpager为fragment准备的适配器源码中,自动为你自定调用了这个方法了,也就是说,你滑到了那个fragment,这个fragment就自动加载了这个方法了,所以是没问题的。以上问题会出现,就是出现在用add()方法中,因为这个没有自动帮你调用这个方法,所以用add方法来加入fragment的,在切换fragment的时候要自己调用fragment.setUserVisbleHint(true)哦。

        6,ok,以上之后就没出现什么bug了。















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值