博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用FragmentPagerAdapter和FragmentStatePagerAdapter时Fragment生命周期区别
阅读量:5788 次
发布时间:2019-06-18

本文共 3053 字,大约阅读时间需要 10 分钟。

使用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 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的生命周期都走了,而他们基本上算是交替执行的。那么当我们滑动到第三个页面再划回第一个页面呢?生命周期又会怎么走?

肯定的第三个页面和第四个页面的onAttachonCreate,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则会每次都得到执行。

转载地址:http://xuqyx.baihongyu.com/

你可能感兴趣的文章
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
Open Graph Protocol(开放内容协议)
查看>>
模块化(1):基本思路
查看>>
Ubuntu18.04中配置QT5.11开发环境
查看>>
Exception的妙用
查看>>
基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线!
查看>>
JavaScript(五):变量的作用域
查看>>
知识图谱在互联网金融中的应用
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
wpf 自定义窗口,最大化时覆盖任务栏解决方案
查看>>
【docker】关于docker 中 镜像、容器的关系理解
查看>>
information_schema系列五(表,触发器,视图,存储过程和函数)
查看>>
瓜子二手车的谎言!
查看>>
[转]使用Git Submodule管理子模块
查看>>
DICOM简介
查看>>
Scrum之 Sprint计划会议
查看>>
List<T> to DataTable
查看>>
[Java]Socket和ServerSocket学习笔记
查看>>
stupid soso spider
查看>>