Fragment的懒加载(解决ViewPager中Fragment生命周期错乱的问题)
来源:互联网 发布:福州廉租房租金算法 编辑:程序博客网 时间:2024/05/19 08:40
转载自:http://blog.csdn.net/maosidiaoxian/article/details/38300627
我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个fragment的时候,它才去初始化呢?
答案就在Fragment里的setUserVisibleHint这个方法里。请看关于Fragment里这个方法的API文档(国内镜像地址:http://zdz.la/YrpKlu):
该方法用于告诉系统,这个Fragment的UI是否是可见的。所以我们只需要继承Fragment并重写该方法,即可实现在fragment可见时才进行数据加载操作,即Fragment的懒加载。
代码如下:
在LazyFragment,我增加了三个方法,一个是onVisiable,即fragment被设置为可见时调用,一个是onInvisible,即fragment被设置为不可见时调用。另外再写了一个lazyLoad的抽象方法,该方法在onVisible里面调用。你可能会想,为什么不在getUserVisibleHint里面就直接调用呢?
我这么写是为了代码的复用。因为在fragment中,我们还需要创建视图(onCreateView()方法),可能还需要在它不可见时就进行其他小量的初始化操作(比如初始化需要通过AIDL调用的远程服务)等。而setUserVisibleHint是在onCreateView之前调用的,那么在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常。而把lazyLoad抽离成一个方法,那么它的子类就可以这样做:
在上面的类当中,我们增加了一个标志位isPrepared,用于标志是否初始化完成。然后在我们所需要的初始化操作完成之后调用,如上面的例子当中,在初始化view之后,设置 isPrepared为true,同时调用lazyLoad()方法。而在lazyLoad()当中,判断isPrepared和isVisible只要有一个不为true就不往下执行。也就是仅当初始化完成,并且可见的时候才继续加载,这样的避免了未初始化完成就使用而带来的问题。
在这里我对fragment的懒加载实现的介绍就到此为止,如果你有兴趣,可以基于此再深入探究,比如写一个带有缓初始化和可见时刷新的特性的Fragment。
0 0
- Fragment的懒加载(解决ViewPager中Fragment生命周期错乱的问题)
- ViewPager +Fragment 中Fragment被预加载问题(ViewPager中Fragment的生命周期管理)
- viewpager 中fragment 的生命周期
- ViewPager中Fragment的生命周期
- Android 解决ViewPager+Fragment懒加载的问题
- viewPager+Fragment的生命周期和预加载问题
- viewpager 中fragment 生命周期问题
- 关于ViewPager中显示fragment的生命周期调用问题
- viewpager+fragment的懒加载
- 解决Fragment +Viewpager滑动页面重复加载的问题
- 解决TabLayout +ViewPager + Fragment 不让预加载的问题
- 解决fragment中嵌套fragment加载切换的问题
- fragment 与viewpager预加载的解决 懒加载
- 解决fragment的子fragment中viewpager里面的fragment不销毁 反复创建问题
- viewpager中fragment的生命周期管理
- viewpager中fragment的生命周期管理
- viewpager中fragment的生命周期管理
- ViewPager嵌套Fragment时Fragment的生命周期问题
- error C2065: “list”: 未声明的标识符
- 记者解密速定狗软件—新闻
- 带你认识LabVIEW和MATLAB
- 网络图片加载
- HBuilder开发App教程03-定制图标,启动页以及打包
- Fragment的懒加载(解决ViewPager中Fragment生命周期错乱的问题)
- GCO3.0的图割分割算法应用(三)
- [LeetCode]Search for a Range
- eclipse如何开启/关闭代码提示功能
- java基础------存取大文件数据
- unity如何调用另一个脚本中的变量
- LeetCode Symmetric Tree
- 各种相似度计算的python实现
- shell中的小括号与大括号