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。

目录
相关文章
|
4天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
4天前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
14 2
|
10天前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。
|
10天前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。
|
10天前
|
XML IDE Java
安卓应用开发入门:从零开始的旅程
【10月更文挑战第23天】本文将带领读者开启一段安卓应用开发的奇妙之旅。我们将从最基础的概念讲起,逐步深入到开发实践,最后通过一个简易的代码示例,展示如何将理论知识转化为实际的应用。无论你是编程新手,还是希望扩展技能的软件工程师,这篇文章都将为你提供有价值的指导和启发。
20 0
|
22天前
|
安全 Java 开发工具
掌握安卓应用开发:从基础到高级的全面指南
本文旨在为读者提供一个详尽的指南,帮助他们掌握安卓应用开发的基础知识及高级技巧。从环境搭建到项目实践,逐步深入讲解安卓开发的各个环节。无论是对于刚入门的初学者还是希望进一步提升的开发者,本文都将提供实用的建议和示例代码,帮助你快速上手并提升技能。
|
23天前
|
存储 Java 开发工具
掌握安卓应用开发:从基础到高级的全面指南
这篇文章旨在为读者提供一个关于安卓应用开发的全面指南。无论您是初学者还是有一定经验的开发者,本文将带您深入探讨安卓开发的核心概念、工具和技术。我们将从环境搭建和基本组件讲起,逐步引导您了解布局管理、用户交互处理、数据存储与网络通信等高级主题。通过阅读本文,您将能够更好地理解安卓应用开发的整体流程,并具备创建高质量安卓应用的能力。
|
6天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
5天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
18 5
|
3天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!