使用FragmentPagerAdapter时Fragment的生命周期
FragmentPagerAdapter
会保存在内存中保存Fragment的实例,当ViewPager
中Fragment
的数量较多时,建议使用FragmentStatePagerAdapter
。
当使用FragmentPagerAdapter
时Fragment的生命周期怎么走呢?(使用的是v4包下的Fragment)
当viewpager加载时,会加载当前页跟相邻页的fragment(如果有),那么此时,Fragment的log日志是这样的
I/fragment: onAttach: I/fragment: onCreate: I/fragment: onAttach: I/fragment: onCreate: I/fragment: onCreateView: +position 1I/fragment: onActivityCreated: +position 1I/fragment: onCreateView: +position 0I/fragment: onActivityCreated: +position 0I/fragment: onStart: 0I/fragment: onResume: 0I/fragment: onStart: 1I/fragment: onResume: 1
我们看到,有两个Fragment的生命周期都走了,而他们基本上算是交替执行的。那么当我们滑动到第三个页面再划回第一个页面呢?生命周期又会怎么走?
肯定的第三个页面和第四个页面的onAttach
,onCreate
,onCreateView
,onActivityCreate
,onStart
,onResume
生命周期都会执行。那么顺序是怎么样的呢?我们来看下log日志。 //以下是滑动到Fragment3时走的的生命周期I/fragment: onAttach: I/fragment: onCreate: I/fragment: onCreateView: +position 2I/fragment: onActivityCreated: 2I/fragment: onStart: 2I/fragment: onResume: 2I/fragment: onAttach: I/fragment: onCreate: I/fragment: onPause: 0I/fragment: onStop: 0I/fragment: onDestroyView: 0I/fragment: onCreateView: +position 3I/fragment: onActivityCreated: 3I/fragment: onStart: 3I/fragment: onResume: 3//以下是滑动到fragment0的I/fragment: onCreateView: +position 0I/fragment: onActivityCreated: 0I/fragment: onPause: 3I/fragment: onStop: 3I/fragment: onDestroyView: 3I/fragment: onStart: 0I/fragment: onResume: 0I/fragment: onPause: 2I/fragment: onStop: 2I/fragment: onDestroyView: 2
我们发现Fragment2
的生命周期先走到了onResume
,之后Fragment0
走到了onDestoryView
中,而当我们重新滑到Fragment0
的时候,Fragment0
的生命周期是从onCreateView
开始走的,并没有走onCreate
方法。
使用FragmentStatePagerAdapter时Fragment的生命周期
当使用FragmentStatePagerAdapter
时,第一次走的生命周期跟FragmentPagerAdapter
是一样的。但是当我们滑动到第三个Fragment
(即:Fragment 2)再划回第一个Fragment
(Fragment 0)呢?
I/fragment: onAttach: I/fragment: onCreate: I/fragment: onCreateView: +position 2I/fragment: onActivityCreated: 2I/fragment: onStart: 2I/fragment: onResume: 2I/fragment: onAttach: I/fragment: onCreate: I/fragment: onPause: 0I/fragment: onStop: 0I/fragment: onDestroyView: 0I/fragment: onDestroy: 0I/fragment: onDetach: 0I/fragment: onCreateView: +position 3I/fragment: onActivityCreated: 3I/fragment: onStart: 3I/fragment: onResume: 3I/fragment: onAttach: I/fragment: onCreate: I/fragment: onPause: 3I/fragment: onStop: 3I/fragment: onDestroyView: 3I/fragment: onDestroy: 3I/fragment: onDetach: 3I/fragment: onCreateView: +position 0I/fragment: onActivityCreated: 0I/fragment: onStart: 0I/fragment: onResume: 0I/fragment: onPause: 2I/fragment: onStop: 2I/fragment: onDestroyView: 2I/fragment: onDestroy: 2I/fragment: onDetach: 2
我们可以看到,当我们滑动到第三个Fragment(Fragment 2
)时,第一个Fragment(Fragment 0
)的生命周期已经走到了onDetach
,此时Fragment0
已经和activity解绑。也就不会在内存中保存Fragment的实例。
分析
通过上面的Fragment的生命周期我们可以看到,当ViewPager使用FragmentPagerAdapter
时滑动viewpager,Fragment并不会跟acvitity解绑,并且划回该Fragment时,onCreate
方法也不会执行。FragmentStatePagerAdapter
时,Fragment已经跟activity解绑了,重新划回该Fragment时,Fragment的生命周期会全部走一遍。
因此当我们在Fragment的onCreate方法中执行的网络请求,那么在FragmentPagerAdapter
中,该网络请求只会执行一次,而FragmentStatePagerAdapter
则会每次都得到执行。