优雅的懒加载方法
来源:互联网 发布:美术字在线生成器软件 编辑:程序博客网 时间:2024/05/02 02:56
最近在重构公司公司的主页,其中用到了懒加载,所以找了网上的懒加载的介绍的博客,读了好几篇关于懒加载的文件,发现不是讲解太简单,就是代码不够清晰,而且在懒加载的实现原理上没有透彻的讲清楚,在实际应用实践中会发现各种不同问题。小弟不才,愿意认真分析懒加载的原理实现与应用,希望对各位看官有些收获。
在使用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 展现出来时,才会加载数据。
- 优雅的懒加载方法
- Spring Mvc 无法加载js、css文件解决办法【待补充其他优雅的方法】
- 优雅关闭socket的方法:SO_LINGER
- 优雅地实现RecyclerView的上拉加载
- 安卓如何优雅的加载图片问题探究
- setUserVisibleHint()方法的懒加载
- 怎样写一个尽可能优雅的equals方法
- Nodejs异步回调的优雅处理方法
- Kotlin(2): 优雅地扩展类的方法和属性
- Java程序优雅关闭的两种方法
- iOS富文本编辑器之更"优雅的"实现方法
- Android6.0 申请权限比较优雅的处理方法
- Nodejs异步回调的优雅处理方法
- 【优雅编程之道】之方法的9点建议
- 再探win32绘制正弦图像的最优雅方法:DPtoLP
- 一个优雅地探索相关性的新可视化方法
- Hibernate中解决懒加载的方法
- load方法的懒加载及原理
- 串口通信的基本概念
- 2016 Multi-University Training Contest 1 -1006 PowMod
- 安装vs2013的entityframework
- window消息处理模块
- 给自己技术发展之路上的意见
- 优雅的懒加载方法
- 解决编译apache出现的问题:configure: error: APR not found . Please read the documentation
- 《App研发录》知识点汇总
- cocos2dx实现简单卡牌翻转效果
- 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
- DroidPlugin源码分析插件进程管理以及预注册Activity,Service,ContentProvide的选择
- entityframework 增删改查
- Codeforces Round #364 (Div. 2) 题解
- Cards(Codeforces 701A)(Codeforces Round #364Div.2 A)