Android应用开发—ViewPager FragmentPagerAdapter和FragmentStatePagerAdapter下Fragment的生命周期

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/78170499 ViewPager配合不同的PagerAdapter,对应Fragment的生命周期有着不同的表现,了解这个生命周期机制对于开发者选择合适的PagerAdapter实现不同的效果,有着很大的帮助。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/78170499

ViewPager配合不同的PagerAdapter,对应Fragment的生命周期有着不同的表现,了解这个生命周期机制对于开发者选择合适的PagerAdapter实现不同的效果,有着很大的帮助。

FragmentPagerAdapter和FragmentStatePagerAdapter的区别:

  • FragmentPagerAdapter:
    类内的每一个生成的 Fragment
    都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter。
  • FragmentStatePagerAdapter:
    正如其类名中的 ‘State’ 所表明的含义一样,该 PagerAdapter
    的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源; 而在页面需要显示时,生成新的页面(就像 ListView的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。

viewPager.setOffscreenPageLimit(X)对Fragment创建时机的影响:

如果ViewPager下有N个fragments,并设置了setOffscreenPageLimit(X),则当fragment1用户可见时,其后面X个fragment也已经同fragment1一同预先创建完成。当滑动fragment1->fragment2时,第X+2个fragment完成创建,以保持当前fragment(fragment2)后有X个fragment已经创建完成作为缓存。

  • FragmentPagerAdapter和FragmentStatePagerAdapter差别:

如前面提到FragmentPagerAdapter不会释放创建过的fragment,这样当fragment1->fragmentN完成以轮切换后,从fragmentN->fragment1反方向切换时,不会再触发fragment的创建,即onCreate()不会被调用。
而FragmentStatePagerAdapter做从fragmentN->fragment1反方向切换时则会继续触发fragment的创建以保障有X个fragment被创建并缓存着(因为大于X的fragment已经被释放了)

总结:fragment的onCreate()总是预先被调用,且被调用的时机总是同当前用户可见的fragment保持X个fragment的“距离“,即某个fragment的onCreate()被调用时,它的前X个fragment是用户可见的。

奇怪的onResume():前面说明了onCreate()被触发的规律,但是onResume()的触发规律则十分奇怪,eg:有以下fragment,f1,f2,f3,f4当f1->f2时,f2的onResume()被触发,当f2->f3时,f3的onResume()被触发,当f3->f2时,f2的onResume()不会被触发,当f2->f3时,f3的onResume()仍然被触发,鉴于这个onResume()被触发的规律很“混乱”,所以不宜做一些需要确定性的任务。(后面有机会在研究下了)

实际应用:

当fragment切换至用户可见后,要做一些处理,比如请求网络数据,更新当前页面等。

经过前面的分析可知onCreate()和onResume()的触发时机都不满足以上要求:onCreate()会预创建,FragmentPagerAdapter下还会一直缓存,onResume()的触发时机又没有规律(正常情况下大家对于这种需求一般会想到resume()这类接口)。

我们可以利用setUserVisibleHint()接口实现该功能,即当本fragment为用户可见时,该接口被触发,以达到每次fragment切换为可见后,更新当前fragment页面数据的目的。

实现类似网易新闻客户端,ViewPager每次只加载当前页。
如前所诉,使用FragmentPagerAdapter或者FragmentStatePagerAdapter都会默认多加载X页(X通过setOffscreenPageLimit()设置,最小值为1)。

这个需求同样通过setUserVisibleHint()来实现,将网络请求加载页面的处理,从onCreate()中移到setUserVisibleHint()中,这样就实现了切换到页面才进行更新的效果。

notes:貌似在某些厂商的rom上对FragmentPagerAdapter的缓存机制做了改动,导致缓存失效,这样就要十分小心对缓存fragment生命周期的处理,尽量避免引用不在前台展示的fragment。

目录
相关文章
|
6天前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
15天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
15天前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
36 2
|
22天前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。
|
10天前
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
21天前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。
|
22天前
|
XML IDE Java
安卓应用开发入门:从零开始的旅程
【10月更文挑战第23天】本文将带领读者开启一段安卓应用开发的奇妙之旅。我们将从最基础的概念讲起,逐步深入到开发实践,最后通过一个简易的代码示例,展示如何将理论知识转化为实际的应用。无论你是编程新手,还是希望扩展技能的软件工程师,这篇文章都将为你提供有价值的指导和启发。
28 0
|
JavaScript Android开发
《Android应用开发攻略》——1.6 理解Android生命周期
本节书摘来自华章计算机《Android应用开发攻略》一书中的第1章,第1.6节,作者:(美)达尔文(Darwin, I. F.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
885 0
|
6天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
8天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。