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为false
3.此时位于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为false
4.此时位于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为false
6.假如在<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为false
f1,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