fragment懒加载小总结
来源:互联网 发布:python源码下载 编辑:程序博客网 时间:2024/06/05 03:41
总结一下fragment懒加载
前提:tabLayout+viewPager+fragment,不考虑fragment销毁(我一般做法是直接覆盖掉destroyItem方法)
BaseFragment中懒加载代码(网上通用的代码) :
在这没有检测视图是否已经加载,可自行搜索实现,在这主要关心fragment数据的加载与刷新问题
protected boolean isVisible = false;@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (getUserVisibleHint()) { isVisible = true; onVisible(); } else { isVisible = false; onInvisible(); }}protected void onVisible() { lazyLoad();}protected abstract void lazyLoad();protected void onInvisible() {}
然后子类继承BaseFragment(tabLayout的标题1,2,3,4对应f1,f2,f3,f4)
@Override
protected void lazyLoad() { if (!isVisible) { return; }}@Overridepublic void onResume() { super.onResume(); Log.e(getClass().getSimpleName(), "onResume isVisible"+isVisible);}
第一次进入Activity,假设共有4个fragment(f1,f2,f3,f4)此时四个fragment都还没有创建,默认显示1
1. 此时位于f1
<1>f1,f2被创建,分别触发setUserVisibleHint, 把isVisible都设为false
<2>创建后,f1触发setUserVisibleHint,把isVisible设置为true,然后onVisible(),接着lazyLoad(),然后onResume()
f2直接onResume(),此时f2的isVisible为false
2.
如果点击2,从1切换到2 <1> f3被创建,触发setUserVisibleHint, 把isVisible设为false <2> f1被隐藏,触发setUserVisibleHint,把isVisible由true设置为false <3> f2显示出来,触发setUserVisibleHint,把isVisible 由false设置为true,然后onVisible,接着lazyLoad, 由于f3是第一次被创建,所以f3触发onResume,此时f3的isVisible为false3.此时位于f2,点击3,从2切换到3<1> f4被创建,触发setUserVisibleHint, 把isVisible设为false(到这时4个fragment已经都被创建出来)<2> f2被隐藏,触发setUserVisibleHint,把isVisible由true设置为false <3> f3显示出来,触发setUserVisibleHint,把isVisible 由false设置为true,然后onVisible(),接着lazyLoad(), 由于f4是第一次被创建,所以f4触发onResume(),此时f4的isVisible为false4.此时位于f3,点击4,从3切换到4 <1>由于f4是最后一个,所以没有需要创建的fragment,不再创建 <2>f3被隐藏,触发setUserVisibleHint,把isVisible设置为false <3>f4显示出来,触发setUserVisibleHint,把isVisible设置为true, 然后onVisible(),lazyLoad()5.假如在<1>后直接点击3,不点击2,此时从1切换到3
<1>先创建f3和f4,f3,f4都触发setHintVisibleHint,把isVisible设为false<2>f1被隐藏,isVisible变为false <3>f2不改变,本来就不显示 <4>f3显示出来,触发setUserVisibleHint,把isVisible设置为true,然后onVisible(),然后lazyLoad(),然后onResume() <5>f4不显示,只触发onResume,此时f4的isVisible为false6.假如在<1>后直接点击4,不点击2或者3,此时从1切换到4<1>先创建f3和f4,f3,f4都触发setHintVisibleHint,把isVisible设为false<2>f1被隐藏,isVisible变为false <3>f2不改变,本来就不显示 <4>f4显示出来,触发setUserVisibleHint,把isVisible设置为true,然后onVisible(),然后lazyLoad(),然后onResume() <5>f3不显示,只触发onResume,此时f3的isVisible为falsef1,f2,f3,f4这4个fragment都创建以后:1.如果此时进行fragment切换操作,例如从3切换到1,那么
<1>f3隐藏,isVisible设为false
<2>f1显示出来,isVisible设置为true,触发onVisible(), 接着触发lazyLoad(); 对于其他切换也是一样的,如果x切换到y,x隐藏,isVisible设置为false, y显示,isVisible设置为true,然后onVisible(),然后lazyLoad()在fragment来回切换中不会触发onResume(忽略fragment销毁问题),只会触发lazyLoad,所以可以在lazyLoad()中进行数据刷新(如果有需要的话)
2.如果跳到其他界面再回来,或者按下home键然后再回来,已经创建的fragment都会触发onResume
也就是说:<1>如果只有f1,f2被创建,那么只有f1,f2触发 onResume,f3,f4不会触发onResume
<2>如果f1,f2,f3被创建,那么f1,f2,f3触发onResume,如果f1,f2,f3,f4都已经被创建,那么f1,f2,f3,f4都触发onResume, 但是这个过程不会触发setUserVisibleHint方法,每个fragment的isVisible属性值不变回来之后还是只有原来显示的那个fragment的isVisible为true,其他为false
<3>由于涉及不setUserVisibleHint方法,所以这一过程也不涉及onVisible(),lazyLoad()
如果有跳到其他Activity再回来,或者home键后再回来刷新数据的需求,可以在onResume中处理。
也可以根据isVisible是否为true来决定是否只刷新当前fragment等等
0 0
- fragment懒加载小总结
- 懒加载总结小收集
- 面试总结(5):Fragment的懒加载
- get、load与懒加载小总结
- ViewPager加载Fragment懒加载
- Fragment中的懒加载
- Fragment懒加载
- fragment懒加载
- Fragment的懒加载
- Fragment的懒加载
- Fragment实现懒加载
- Fragment实现懒加载
- Fragment的懒加载
- Fragment懒加载
- ViewPager+Fragment懒加载
- Viewpager Fragment懒加载
- fragment 懒加载
- Fragment懒加载
- A Simple Problem with Integers (线段树区间更新)
- unity3D-游戏/AR/VR在线就业班 蓝鸥C#入门泛型学习笔记
- GIT 命令收集
- Navicat 连接oracle 11g突然蹦出了一个错误“ORA-28547:connection to server failed,probable Oracle Net admin error”
- json中的单引号
- fragment懒加载小总结
- Futaba S-BUS controlled by mbed(使用mbed控制Futaba S-BUS)
- java学集合前准备知识object类中的常用方法
- 对Verilog 初学者比较有用的整理(转自它处)
- linux无法umount解决方案
- 小白学习html标签归纳
- Android 控件之ImageButton、ImageView
- Ubuntu 安装ruby on rails
- Hierarchical Select in a block as a taxonomy filter