ViewPager 中 Fragment的生命周期 与 网络请求懒加载
FragmentPagerAdapter VS FragmentStatePagerAdapter
- FragmentPagerAdapter
Adapter 每页都是一个Fragment,并且所有的Fragment实例一直保存在Fragment manager中。所以它适用于少量固定的fragment,比如一组用于分页显示的标签。除了当Fragment不可见时,它的视图层有可能被销毁外,每页的Fragment都会被保存在内存中。
经过测试我们可以发现,当使用 FragmentPagerAdapter 的时候已经被创建的页面变为不可见的时候生命周期为:
onPause -> onStop -> onDestroyView
- FragmentStatePagerAdapter
每页都是一个Fragment,当Fragment不被需要时(比如不可见),整个Fragment都会被销毁,除了saved state被保存外(保存下来的bundle用于恢复Fragment实例)。所以它适用于很多页的情况。
经过测试我们可以发现,当使用 FragmentPagerAdapter 的时候已经被创建的页面变为不可见的时候生命周期为:
onPause -> onStop -> onDestoryView -> onDestroy -> onDetach
可以看出当使用 FragmentStatePagerAdapter 的时候,不会保留不可见(不相邻的)页面在内存中,而是直接销毁了,等下次在可见(相邻页面可见)的时候再次创建。
FragmentPagerAdapter 中 Fragment 的生命周期( setUserVisibleHint 乱入)
我们知道 Fragment 生命周期函数有 :
setUserVisibleHint(乱入的不用在意我) -> onAttach —> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDetach -> onDestroy
Fragment 本身作为片段存在于 Activity中,当 Fragment 单独使用的时候其生命周期是伴随着 Activity 的生命周期的,即 Activity onResume 的时候 内部所有的 Fragment 也就走到了 onResume 这点初学者可能不会太在意,在这里作为题外话敲下黑板。
想要进一步了解的请参照: 与 Activity 生命周期协调一致
下面说用 FragmentPagerAdapter 承载页面的 Fragment 时候对应的生命周期。这里说的情况都是没有设置 setOffscreenPageLimit 属性的时候。这里假设 ViewPager 中有3个 Fragment :OutAFragment ,OutBFragment,OutCFragment 。当首次进入 Activity 时候 ViewPager 会初始化 OutAFragment,并预加载 OutBFragment,生命周期如下所示:
// 首次进入界面 A
E/TAG: OutAFragment unVisibleToUser
E/TAG: OutBFragment unVisibleToUser
E/TAG: OutAFragment isVisibleToUser
E/TAG: OutAFragment onAttach
E/TAG: OutAFragment onCreate
E/TAG: OutBFragment onAttach
E/TAG: OutBFragment onCreate
E/TAG: Out