一、背景

在Android应用中,ViewPager是我们不可避免使用的一个控件,因为它可以使我们在占用较少空间的同时,增强内容的丰富性,同时以其内部流淌着Google的血液,所以它几乎成了每一个App的标配控件。但是,假如ViewPager的每一个Fragment都需要通过网络拉取数据加载,而ViewPager是默认加载前两项的,所以在很容易造成网络丢包或者网络堵塞等问题,所以Fragment使用懒加载是非常有必要的。

举个栗子:

如上图所示,我们有两个大的Tab:人物和风景。而人物Tab下有三个Tab:美女、帅哥、萌娃三个Tab,风景Tab下有:北京、香港、上海三个Tab。假如当App刚启动时,执行的生命周期如下:

我们可以看到,App会默认加载美女和帅哥两个Fragment,并且它们的生命周期都执行到onStar()方法,同时加载两个Fragment,假如我们在Fragment加载的时候拉取网络数据,那么就会造成如上所说的网络丢包或者网络堵塞等问题,所以我们为了避免这个问题,就需要实现Fragment的懒加载,当我们对Fragment可见的时候,再进行网络加载数据。

二、实现Fragment懒加载

针对背景讨论的问题,我们最终要实现的目标就是,当Fragment对我们可见时,我们才进行网络加载,然后再解析数据,更新UI。针对上面的Demo,我们需要做到如下效果:

要实现起来其实也并不复杂,在Fragment中有一个setUserVisibleHint这个方法,而且这个方法是优于onCreate()方法的,所以也可以作为Fragment的一个生命周期来看待,它会通过isVisibleToUser告诉我们当前Fragment我们是否可见,我们可以在可见的时候再进行网络加载。

public void setUserVisibleHint(boolean isVisibleToUser)

当我们在setUserVisibleHint方法中进行Log输出时,我们可以看到:

只有可见时,我们isVisibleToUser为true,否则为false。所以我们可以重写setUserVisibleHint方法,然后在可见时进行网络加载数据:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {Log.d("TAG", mTagName + " setUserVisibleHint() --> isVisibleToUser = " + isVisibleToUser);if (isVisibleToUser) {pullData();}super.setUserVisibleHint(isVisibleToUser);
}

三、根据实际用途使用懒加载

由第二部分我们可以知道,setUserVisibleHint(boolean isVisibleToUser)方法是比onCreate更早调用的,但是我们一般在加载数据时,都会在数据加载完成时进行UI更新,所以这就有了一个问题,假如拉取数据是秒回,但是我们还没有进行UI绑定,或者是Adapter初始化等,那么我们就无法更新UI了,所以Fragment给我们提供了另一个方法getUserVisibleHint(),它就是用来判断当前Fragment是否可见,所以我们就可以在一系列变量初始化完成后再判断是否可见,若可见再进行数据拉取:

@Override
public void onStart() {super.onStart();Log.d("TAG", mTagName + " onStart()");...if(getUserVisibleHint()) {pullData();}}

当然,如果你的网络请求并不需要涉及UI更新,那么就可以直接在setUserVisibleHint(boolean isVisibleToUser)里操作,所以最终还是要根据各自的实际用途来使用。

最后,附上懒加载的Demo:Github/LazyFragment

转载于:https://www.cnblogs.com/ryanleee/p/8204685.html

Android优化方案之--Fragment的懒加载实现相关推荐

  1. Fragment.setUserVisibleHint()懒加载过时问题优化

    文章目录 ViewPager+FragmentPagerAdapter 被标记为过时 源码浅析 结论 举个栗子 不传BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT时 传入B ...

  2. fragment的懒加载

    1 为什么需要懒加载 用fragment+viewpager+fragmentPagerAdapter作为框架 ,会出现fragment预加载. 2.用setUserVisibleHint()方法可以 ...

  3. Fragment的懒加载与生命周期详解

    提示:本文仅为笔者学习记录 Fragment的懒加载与生命周期详解 什么是懒加载 了解Fragment的生命周期 onAttach onCreate onCreateView onActivityCr ...

  4. 安卓:Fragment的懒加载

    Android应用开发过程中,ViewPager同时加载多个fragment,以实现多tab页面快速切换, 但是fragment初始化时若加载的内容较多,就可能导致整个应用启动速度缓慢,影响用户体验. ...

  5. vue2首屏性能优化(splitChunks/externals/gzip/路由懒加载)

    首屏加载慢原因: Vue只有第一次会加载页面, 以后的每次页面切换,只需要进行组件替换.因为Vue 是SPA,所以首页第一次加载时会把所有的组件以及组件相关的资源全都加载了,造成网站首页打开速度变慢的 ...

  6. 微信小程序优化:如何实现图片懒加载?

    前言 当我们在使用微信小程序浏览图片时,不可避免地会遇到加载缓慢的情况.这不仅会影响用户体验,还会耗费用户的流量.那么,有没有一种方法可以让图片在用户需要时再进行加载,从而提升用户体验和减少流量消耗呢 ...

  7. Fragment实现懒加载解决方案

    场景分析 当一个 MainActivity 对应显示3个 Fragment 时,假设默认显示第一个Fragment,那么第二和第三个Fragment的数据就可以延迟加载.如果加载数据比较耗时或者都是类 ...

  8. 防抖与节流方案_关于图片懒加载的几种方案

    作者: 山月行 转发链接:https://mp.weixin.qq.com/s/rY1LbW95LR6AqF1Vcx_d1Q 懒加载,顾名思义,在当前网页,滑动页面到能看到图片的时候再加载图片 故问题 ...

  9. 网页速度很慢优化方案:如何提高网页加载速度,提升网站加载速度

    网站加载速度的快慢,直接影响用户的去留.这里为大家持续更新我的经验,帮你解决网页速度很慢,慢在哪里,该怎么优化的问题.希望对你有所帮助! 1.  网站空间要好:网站需要一个稳定的服务器或者虚拟机,可以 ...

最新文章

  1. linux下mysql修改字符集,远程连接
  2. CSDN 中秋节日礼品盒 | 中秋节快乐
  3. 云计算将成为媒体融合发展与数字化变革的加速剂
  4. 学英语不必太在意单词
  5. class类文件结构
  6. 浅谈同城双中心的网络部署模型
  7. html5在li中添加按钮,如何在html5blank_nav()中的ul和li中添加类?
  8. python没有这个xlwt模块_python xlwt模块简介
  9. mpu9250姿态融合算法_基于投票方式的机器人装配姿态估计
  10. 后面的 飞鸽传书 l代表lock
  11. js中字符串全部替换函数(正则表达式)
  12. access百度翻译 get_求助,百度翻译后我还是不知道怎么解决这个问题
  13. 手机APP和微信小程序能否取代域名?
  14. 计算机在线考试摘要,基于WEB的网络在线考试系统-毕业论文中文摘要题目(可编辑).doc...
  15. jquery Boxy的使用方法
  16. 数显之家快讯:【SHIO世硕心语】2021,新的一年写给自己的5句话!
  17. 西安市:外地职工离职如何提取公积金
  18. UEBA对抗威胁之“健康就是财富”!
  19. 这就是区块链开源底层软件平台——长安链ChainMaker
  20. 读:Multi-scale pulmonary nodule classification with deep feature fusion via residual network

热门文章

  1. PHP加密解密函数之Base64
  2. python 处理CSV数据
  3. 【转】一劳永获的解决textbox 只能输入数字、汉字、字母等问题
  4. ReactNative 自定义封装Radio单选组件
  5. 数据库原理—数据、数据库(一)
  6. 英语学习—每天进步一丢丢系列(一)
  7. 比较默认对象和默认约束的异同_UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)...
  8. 一程序员反应职场怪现象
  9. 年轻人如何抵抗居高不下的房价?
  10. 为什么一些手机厂商要砍掉呼吸灯?