Android 懒加载
来源:互联网 发布:软件测试第二版pdf 编辑:程序博客网 时间:2024/06/10 23:39
最近在重构公司公司的主页,其中用到了懒加载,所以找了网上的懒加载的介绍的博客,读了好几篇关于懒加载的文件,发现不是讲解太简单,就是代码不够清晰,而且在懒加载的实现原理上没有透彻的讲清楚,在实际应用实践中会发现各种不同问题。小弟不才,愿意认真分析懒加载的原理实现与应用,希望对各位看官有些收获。
在使用viewpager(或其他容器)与多个Fragment来组合使用,ViewPager 会默认一次加载当前页面前后隔一个页面,即使设置setofflimit(0)也无效果,也会预加载。这样把我们看不到的页面的数据也加载了,大大降低了性能,浪费初始化资源。然而我们就采用懒加载技术,只让用户看到的页面才会加载他的数据,大大提高效率。
主要的方法是Fragment中的setUserVisibleHint(),此方法会在onCreateView()之前执行,当viewPager中fragment改变可见状态时也会调用,当fragment 从可见到不见,或者从不可见切换到可见,都会调用此方法,使用getUserVisibleHint() 可以返回fragment是否可见状态。
onLazyLoad() 加载数据必须满足三个条件:
- getUserVisibleHint()会返回是否可见状态,这是fragment实现懒加载的关键,只有fragment 可见才会调用onLazyLoad() 加载数据。
- isPrepared参数在系统调用onActivityCreated时设置为true,这时onCreateView方法已调用完毕(一般我们在这方法里执行findviewbyid等方法),确保 onLazyLoad()方法不会报空指针异常。
- isLazyLoaded确保ViewPager来回切换时BaseFragment的initData方法不会被重复调用,onLazyLoad在该Fragment的整个生命周期只调用一次,第一次调用onLazyLoad()方法后马上执行 isLazyLoaded = true。
另外我们在BaseLazyFragment 中需要在onActivityCreated()及setUserVisibleHint()方法中都调了一次lazyLoad() 方法。如果仅仅在setUserVisibleHint()调用lazyLoad(),当默认首页首先加载时会导致viewPager的首页第一次展示时没有数据显示,切换一下才会有数据。因为首页fragment的setUserVisible()在onActivityCreated() 之前调用,此时isPrepared为false 导致首页fragment 没能调用onLazyLoad()方法加载数据。
实现代码如下:
/** * 懒加载fragment基类 * Created by wanny on 16/7/18. */public abstract class BaseLazyFragment extends BaseFragment { /** * 懒加载过 */ private boolean isLazyLoaded; private boolean isPrepared; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); isPrepared = true; //只有Fragment onCreateView好了, //另外这里调用一次lazyLoad() lazyLoad(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); lazyLoad(); } /** * 调用懒加载 */ private void lazyLoad() { if (getUserVisibleHint() && isPrepared && !isLazyLoaded) { onLazyLoad(); isLazyLoaded = true; } } @UiThread public abstract void onLazyLoad();}
然后我们再继承这个BaseLazyFragment 实现onLazyLoad() 方法就行。他会自动控制当fragment 展现出来时,才会加载数据
- Android Fragment 懒加载
- Android 懒加载
- android Fragment 懒加载布局
- Android ViewPager禁止懒加载
- Android之ViewPage懒加载
- Android之Fragment懒加载
- Android Fragment实现懒加载
- Android之Fragment懒加载
- Android Fragment 实现懒加载
- Android ViewPager + Fragment懒加载
- 关于android Fragment懒加载
- android中的懒加载机制
- Android 实现fragment懒加载
- Android viewpager + fragment 的懒加载 只加载一次
- Android Fragment预加载与懒加载问题
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
- MySQL5.7 添加用户、删除用户与授权
- storm DRPC指南
- CSS中position属性( absolute | relative | static | fixed )详解
- HTML5性能优化(一)
- 2017/8/2java前端一
- Android 懒加载
- 自己开发的网页在跳转至微信公众号文章后,点击微信的返回,无法返回原网页
- 利用while循环录入班级成绩,并且计算avg
- phpmyadmin登录提示mysqli_real_connect(): (HY000/2002): No such file or directory解决
- Java并发ThreadLocal类
- iTween基础之Move(移动)
- JavaScript事件代理和委托(Delegation)
- Java读取csv文件的一种方法
- iOS Context 基础教程 (二)