日常项目中无可或缺的会用到ViewPager嵌套Fragment的操作,以及Fragment中再嵌套Fragment的这种复杂嵌套的操作.由于ViewPager的缓存机制就会加载多个Fragmen页面导致加载速度变慢,这个时候我们就用到了Fragment 懒加载操作了
懒加载: 就是懒驴拉磨 打一鞭走一步即,触发执行 不触发不执行
示例效果实现是基于 ViewPager+FragmentStatePagerAdapter+Fragment
上述效果要实现懒加载需要首先学习Fragment在ViewPager中的生命周期执行
Fragment的创建以及离开和回到页面的生命周期
Fragment 创建生命周期:
setUserVisibleHint() ->onAttach -> onCreate -> onCreatedView -> onActivityCreated -> onStart -> onResume ->onPause ->
onStop -> onDestroyView -> onDestroy -> onDetach
Fragment 离开流程():
默认缓存数左右一个
缓存数内执行: ->setUserVisibleHint(false) 不执行onPause的操作
缓存数外执行: ->setUserVisibleHint(false) ->onPause() ->onStop() -> onDestroyView() -> onDestroy() -> onDetach()(执行销毁操作)
Fragment 重新展示:
缓存数内执行: setUserVisibleHint(true) 不执行onResume()的操作
缓存数内执行: setUserVisibleHint(true) ->onAttach() ->oncreate() ->onCreatedView() -> onViewCreated() ->onStart ()-> onResume()(执行创建操作)
*由上边的生命周期数据可以得出ViewPager+Fragment,切换Fragment的时氛围两种情况
- 当位置切换的位超出ViewPager设置的初始化中配置setOffscreenPageLimit()的个数时,离开页面的Fragment会执行销毁动作重新进入页面执行创建操作
- 切换的位置未超出setOffscreenPageLimit() 个数 执行的是setUserVisibleHint() 进入是true 退出是false
由上边的生命周期可以看出要实现懒加载主要用到的方式是setUserVisibleHint()此方法在页面要是展示在前台的和处于后太的时候被调用
实现方式
- setUserVisibleHint()+onResume()+onPause()
- Androidx 包下 FragmentTransaction.setMaxLifecycle() 用于替代setUserVisibleHint(),在 FragmentStatePagerAdapter ,FragmentPagerAdapter等Adapter
总结
Fragmen 懒加载分为好多种情况 所以要做到具体问题具体分析,这里只处理ViewPager+Fragment的这种方案 不处理单独添加Fragment的懒加载方案.以后将基于上边的两种实现方式处理Fragment的懒加载