fragment懒加载的前世与今生_mashanshui的博客-CSDN博客
以前处理 Fragment 的懒加载,我们通常会在 Fragment 中处理 setUserVisibleHint (ViewPager)+ onHiddenChanged(
FragmentTransaction)
这两个函数,而在 Androidx 模式下,我们可以使用 FragmentTransaction.setMaxLifecycle()
的方式来处理 Fragment 的懒加载。
在AndroidX之前,Fragment的使用有两种方式:
分析:
由于ViewPager的缓存机制offscreenPageLimit
始终>=1,所以ViewPager会缓存布局屏幕外的Fragment>=1个
,被缓存的屏幕外的Fragment也会像屏幕可见的Fragment一样执行生命周期到onResume
,并且在用户滑动后缓存的Fragment由不可见到可见时并不会调用onResume
。根据ViewPager调用Fragment的方法顺序:
setUserVisibleHint->onAttach->onCreate->onCreateView->onViewCreated->onActivityCreated->onStart->onResume
所以,在androidX之前,ViewPager模式的懒加载方式是:
onResume
方法中执行懒加载请求数据setUserVisibleHint
方法中执行懒加载请求数据对于一个FrameLayout绑定多个Fragment,并每次只显示一个,我们可以这样通过FragmentTransaction控制Fragment的行为
FragmentTransaction模式下的Fragment
会全部执行生命周期至onResume
,并且会调用onHiddenChanged
表示Fragment隐藏是否发生改变,但是第一个可见的Fragment因为是可见的,所以并不会调用onHiddenChanged
。
所以,anroidX之前FragmentTransaction模式下的懒加载:
onResume
方法和isHidden
变量进行判断进行懒加载。onHiddenChanged
方法进行懒加载:通过上面的分析我们知道在AndroidX之前,不管Fragment是否可见,都执行了onResume
方法,这就违背了生命周期中onResume的设计本意了。所以在安卓X中,在FragmentTransaction
类中增加了一个方法setMaxLifecycle(@NonNull Fragment fragment,@NonNull Lifecycle.State state)
,我们可以通过这个方法的第二个参数设置Fragment最大能执行到哪个生命周期方法。
对于不可见的Fragment,我们可以通过FragmentTransaction. setMaxLifecycle(fragment, Lifecycle.State.STARTED)
设置Fragment最大执行到onStart()
方法。
对于可见的Fragment,通过FragmentTransaction. setMaxLifecycle(fragment, Lifecycle.State.RESUMED)
设置Fragment最大执行到onResume()
方法。