微信号:jszj2014215

介绍:主要分享移动互联网的相关产品和资讯,关注你将学习到更多,在互联网的当下你会赚更多的钱...

Android之Fragment懒加载

2016-11-02 08:03 点这里

还记得以前使用ViewPager+Fragment时根本不考虑效率问题,一股脑的多页数据加载导致卡死,还自我安慰说我设置了setOffscreenPageLimit了啊,而实际上跟踪源码我们发现DEFAULT_OFFSCREEN_PAGES = 1,所以即便setOffscreenPageLimit我设置为0,ViewPager最少也会加载后一页。为了保证效率现在都提倡一种懒加载的机制,即只有当前页面为显示页面才会加载且只加载一次数据(做一次耗时操作:或网络请求或本地数据)。有同学说我可以拷贝源码把默认改为0啊,是可以这么做,但是改变了viewpager的初衷,不够灵活。在实际项目中我还是建议改造BaseFragment,利用setUserVisibleHint,暴露数据加载的方法,根据需要重载懒加载方法做实际操作。

下面来看具体的改造方法:

1.设定两个标识

private boolean isViewPrepared; // 标识fragment视图已经初始化完毕private boolean hasFetchData; // 标识已经触发过懒加载数据

2.创建懒加载的数据加载方法

/**  懒加载的方式获取数据,仅在满足fragment可见和视图已经准备好的时候调用一次 */protected void lazyFetchData() {    
Log.v(TAG, getClass().getName() + "------>lazyFetchData");
}

3.以上两个标识值的判定:

  • 在onViewCreated方法中(即表明视图已经准备完毕)isViewPrepared = true;

  • 在onDestroyView方法中(view被销毁后,将可以重新触发数据懒加载,因为在viewpager下,fragment不会再次新建并走onCreate的生命周期流程,将从onCreateView开始)hasFetchData = false; isViewPrepared = false;

4.判定是否需要加载数据

private void lazyFetchDataIfPrepared() {    // 用户可见fragment && 没有加载过数据 && 视图已经准备完毕    if (getUserVisibleHint() && !hasFetchData && isViewPrepared) {  
      hasFetchData = true; //已加载过数据
      lazyFetchData();    
      }
}

5.lazyFetchDataIfPrepared方法的调用时机

  • onViewCreated方法中调用lazyFetchDataIfPrepared方法,此时只有首页会符合条件

  • setUserVisibleHint

    @Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {  
      super.setUserVisibleHint(isVisibleToUser);    
      Log.v(TAG, getClass().getName() + "------>isVisibleToUser = " +               isVisibleToUser);   
     if (isVisibleToUser) {//当当前为显示页面时
          lazyFetchDataIfPrepared();   
     }
    }

6.子类Fragment根据需要重载lazyFetchData方法(访问网络加载数据)

@Overrideprotected void lazyFetchData() {    
  ((DiscoverPresenter) mPresenter).getData();
}

整个改造就算结束了,是不是很简单,为了让你的fragment不那么累赶紧试试吧(如果还有不懂可以参照源码)。

 

 

来自:http://www.jianshu.com/p/fccc7716f47e


 
Android技术之家 更多文章 你真的知道GET和POST真正区别吗? Android应用框架需要做的事情 Android统一风格 —— 主题 Android JSBridge的原理与实现 快速使用反射更换Android全局字体
猜您喜欢 intel: CAT技术助力数据中心资源隔离 【第219期】既不缺钱又不缺人,为何你的系统还是做砸了? MySQL Cluster集群探索与实践 『互联网专车出行数据安全之301亲身体验』 扒一扒HTTPS网站的内幕