资讯专栏INFORMATION COLUMN

使用FragmentPagerAdapter和FragmentStatePagerAdapter时F

RobinTang / 796人阅读

摘要:使用时的生命周期会保存在内存中保存的实例,当中的数量较多时,建议使用。使用时的生命周期当使用时,第一次走的生命周期跟是一样的。时,已经跟解绑了,重新划回该时,的生命周期会全部走一遍。

使用FragmentPagerAdapter时Fragment的生命周期

FragmentPagerAdapter 会保存在内存中保存Fragment的实例,当ViewPagerFragment的数量较多时,建议使用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 1
I/fragment: onActivityCreated: +position 1
I/fragment: onCreateView: +position 0
I/fragment: onActivityCreated: +position 0
I/fragment: onStart: 0
I/fragment: onResume: 0
I/fragment: onStart: 1
I/fragment: onResume: 1

我们看到,有两个Fragment的生命周期都走了,而他们基本上算是交替执行的。那么当我们滑动到第三个页面再划回第一个页面呢?生命周期又会怎么走?
肯定的第三个页面和第四个页面的onAttachonCreate,onCreateView,onActivityCreate,onStart,onResume生命周期都会执行。那么顺序是怎么样的呢?我们来看下log日志。

//以下是滑动到Fragment3时走的的生命周期
I/fragment: onAttach: 
I/fragment: onCreate: 
I/fragment: onCreateView: +position 2
I/fragment: onActivityCreated: 2
I/fragment: onStart: 2
I/fragment: onResume: 2

I/fragment: onAttach: 
I/fragment: onCreate: 

I/fragment: onPause: 0
I/fragment: onStop: 0
I/fragment: onDestroyView: 0

I/fragment: onCreateView: +position 3
I/fragment: onActivityCreated: 3
I/fragment: onStart: 3
I/fragment: onResume: 3

//以下是滑动到fragment0的
I/fragment: onCreateView: +position 0
I/fragment: onActivityCreated: 0
I/fragment: onPause: 3
I/fragment: onStop: 3
I/fragment: onDestroyView: 3
I/fragment: onStart: 0
I/fragment: onResume: 0
I/fragment: onPause: 2
I/fragment: onStop: 2
I/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 2
I/fragment: onActivityCreated: 2
I/fragment: onStart: 2
I/fragment: onResume: 2

I/fragment: onAttach: 
I/fragment: onCreate: 

I/fragment: onPause: 0
I/fragment: onStop: 0
I/fragment: onDestroyView: 0
I/fragment: onDestroy: 0
I/fragment: onDetach: 0

I/fragment: onCreateView: +position 3
I/fragment: onActivityCreated: 3
I/fragment: onStart: 3
I/fragment: onResume: 3
I/fragment: onAttach: 
I/fragment: onCreate: 
I/fragment: onPause: 3
I/fragment: onStop: 3
I/fragment: onDestroyView: 3
I/fragment: onDestroy: 3
I/fragment: onDetach: 3

I/fragment: onCreateView: +position 0
I/fragment: onActivityCreated: 0
I/fragment: onStart: 0
I/fragment: onResume: 0

I/fragment: onPause: 2
I/fragment: onStop: 2
I/fragment: onDestroyView: 2
I/fragment: onDestroy: 2
I/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则会每次都得到执行。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13132.html

相关文章

  • 如何更新及替换ViewPager中的Fragment

    摘要:最开始处于第页时,不仅为第页创建实例,还为相邻的第页创建了实例刚开始处在注释调用了的构造器方法,下同。由于我们必须在中实例化一个,所以当被调用后,相应的生命周期函数也就被调到了调用了的构造器方法销毁指定位置的。 How to update and replace fragment in viewpager? ListView的工作原理 在了解ViewPager的工作原理之前,先回顾Li...

    lookSomeone 评论0 收藏0
  • PagerAdapter深度解析实践优化

    摘要:如果是那么在初始状态下,默认会出现前两个页面,而主页面是在的起始位置通常是屏幕左侧,直到最后一个页面在屏幕右侧,如果总共个页面,返回值为那么将一次性出现所有的页面用于数据刷新时的页面处理方式。 目录介绍 01.PagerAdapter简单介绍02.PagerAdapter抽象方法03.PagerAdapter原理介绍04.PagerAdapter缓存和销毁05.自定义PagerAdap...

    Paul_King 评论0 收藏0
  • Android基础:Fragment,看这篇就够了

    摘要:也有类似的栈,称为回退栈,回退栈是由管理的。为的参数,通过能找到回退栈的特定元素,可以为或者,表示只弹出该元素以上的所有元素,表示弹出包含该元素及以上的所有元素。是异步执行的,是丢到主线程的执行,是同步版本。 欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 天天P图攻城狮 发布在云+社区 作者简介:damonxia(夏正冬),天天P图Android工程师 下文中Demo的源...

    littleGrow 评论0 收藏0
  • android ViewPagerFragment

    摘要:适用于较多的情况下。但在回调方法之前会回调方法来保存的状态,下次显示时通过把存储的状态值取出来,参考文章中的配合使用三种适配器详解 ViewPager的应用场景 应用开头的引导界面 类似于微信或者今日头条标签页之间的切换 使用步骤 第一步:在布局文件中加入ViewPager组件,并在代码中获得该组件 第二步:为ViewPager添加适配器,ViewPager可以有三种类型的适配器...

    liangdas 评论0 收藏0
  • Android 初级面试者拾遗(前台界面篇)之 Activity Fragment

    摘要:四种状态运行状态暂停状态停止状态销毁状态运行状态处于返回栈的栈顶位置,正在运行与用户发生着交互,系统不愿回收此种状态的。和都是为了解决重复创建问题,的作用域是栈顶,的作用域是整个返回栈。 Context Android 系统组件不同于普通类对象,能够直接创建实例,需要各自的上下文环境——Context。 Context 上下文环境确保 Android 系统组件(Activity、Se...

    jone5679 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<