目录介绍1.什么是懒加载1.1 什么是预加载

1.2 懒加载介绍

1.3 懒加载概括

2.实际应用中有哪些懒加载案例2.1 ViewPager+Fragment组合

2.2 分析源码

3.ViewPager中setOffscreenPageLimit(int limit)相关源码

4.关于ViewPager与Fragment懒加载4.1 遇到的问题

4.2 主要的思路做法

4.3 代码案例展示

4.4 onLazyLoad()加载数据条件

4.5 Fragment的方法setUserVisibleHint

5.懒加载Fragment为什么要继承BaseFragment

0.前言介绍

1.什么是懒加载1.1 什么是预加载ViewPager+Fragment的搭配在日常开发中也比较常见,可用于切换展示不同类别的页面,我们日常所见的咨询、购物、金融、社交等类型的APP都有机会用到这种控件组合

ViewPager控件有个特有的预加载机制,即默认情况下当前页面左右两侧的1个页面会被加载,以方便用户滑动切换到相邻的界面时,可以更加顺畅的显示出来。

通过ViewPager的setOffscreenPageLimit(int limit)可以设置预加载页面数量,当前页面相邻的limit个页面会被预加载进内存

1.2 懒加载介绍懒加载,其实也就是延迟加载,就是等到该页面的UI展示给用户时,再加载该页面的数据(从网络、数据库等),而不是依靠ViewPager预加载机制提前加载两三个,甚至更多页面的数据。这样可以提高所属Activity的初始化速度,也可以为用户节省流量.而这种懒加载的方式也已经/正在被诸多APP所采用。

但是通过ViewPager方法setOffscreenPageLimit(int limit)的源码可以发现,ViewPager通过一定的逻辑判断来确保至少会预加载左右两侧相邻的1个页面,也就是说无法通过简单的配置做到懒加载的效果。

1.3 懒加载概括当页面可见的时候,才加载当前页面。

没有打开的页面,就不会预加载。

说白了,懒加载就是可见的时候才去请求数据。

2.实际应用中有哪些懒加载案例1.1 ViewPager+Fragment的搭配使用懒加载

1.2 H5网页使用懒加载

3.ViewPager中setOffscreenPageLimit(int limit)相关源码3.1 源码如下所示//默认的缓存页面数量(常量)private static final int DEFAULT_OFFSCREEN_PAGES = 1;//缓存页面数量(变量)private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;public void setOffscreenPageLimit(int limit) { //当我们手动设置的limit数小于默认值1时,limit值会自动被赋值为默认值1(即DEFAULT_OFFSCREEN_PAGES) if (limit < DEFAULT_OFFSCREEN_PAGES) { Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "+ DEFAULT_OFFSCREEN_PAGES); limit = DEFAULT_OFFSCREEN_PAGES; } if (limit != mOffscreenPageLimit) { //经过前面的拦截判断后,将limit的值设置给mOffscreenPageLimit,用于 mOffscreenPageLimit = limit; populate(); }}3.2 分析源码可知ViewPager通过一定的逻辑判断来确保至少会预加载左右两侧相邻的1个页面,也就是说无法通过简单的配置做到懒加载的效果。

4.关于ViewPager与Fragment懒加载4.1 遇到的问题在使用viewpager(或其他容器)与多个Fragment来组合使用,ViewPager 会默认一次加载当前页面前后隔一个页面,即使设置setofflimit(0)也无效果,也会预加载。这样把我们看不到的页面的数据也加载了,大大降低了性能,浪费初始化资源。然而我们就采用懒加载技术,只让用户看到的页面才会加载他的数据,大大提高效率。

4.2 主要的思路做法主要的方法是Fragment中的setUserVisibleHint(),此方法会在onCreateView()之前执行,当viewPager中fragment改变可见状态时也会调用,当fragment 从可见到不见,或者从不可见切换到可见,都会调用此方法,使用getUserVisibleHint() 可以返回fragment是否可见状态。

在BaseMVPLazyFragment中需要在onActivityCreated()及setUserVisibleHint()方法中都调了一次lazyLoad() 方法。如果仅仅在setUserVisibleHint()调用lazyLoad(),当默认首页首先加载时会导致viewPager的首页第一次展示时没有数据显示,切换一下才会有数据。因为首页fragment的setUserVisible()在onActivityCreated() 之前调用,此时isPrepared为false 导致首页fragment 没能调用onLazyLoad()方法加载数据。

4.3 代码案例展示public abstract class BaseMVPLazyFragment extends BaseMVPFragment { /** * Fragment的View加载完毕的标记 */ protected boolean isViewInitiated; /** * Fragment对用户可见的标记 */ protected boolean isVisibleToUser; /** * 是否懒加载 */ protected boolean isDataInitiated; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 第一步,改变isViewInitiated标记 * 当onViewCreated()方法执行时,表明View已经加载完毕,此时改变isViewInitiated标记为true,并调用lazyLoad()方法 */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); isViewInitiated = true; //只有Fragment onCreateView好了, //另外这里调用一次lazyLoad() prepareFetchData(); //lazyLoad(); } /** * 第二步 * 此方法会在onCreateView()之前执行 * 当viewPager中fragment改变可见状态时也会调用 * 当fragment 从可见到不见,或者从不可见切换到可见,都会调用此方法 */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); this.isVisibleToUser = isVisibleToUser; prepareFetchData(); } /** * 第四步:定义抽象方法fetchData(),具体加载数据的工作,交给子类去完成 */ public abstract void fetchData(); /** * 第三步:在lazyLoad()方法中进行双重标记判断,通过后即可进行数据加载 * 第一种方法 * 调用懒加载,getUserVisibleHint()会返回是否可见状态 * 这是fragment实现懒加载的关键,只有fragment 可见才会调用onLazyLoad() 加载数据 */ private void lazyLoad() { if (getUserVisibleHint() && isViewInitiated && !isDataInitiated) { fetchData(); isDataInitiated = true; } } /** * 第二种方法 * 调用懒加载 */ public void prepareFetchData() { prepareFetchData(false); } /** * 第三步:在lazyLoad()方法中进行双重标记判断,通过后即可进行数据加载 */ public void prepareFetchData(boolean forceUpdate) { if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) { fetchData(); isDataInitiated = true; } }}4.4 onLazyLoad()加载数据条件getUserVisibleHint()会返回是否可见状态,这是fragment实现懒加载的关键,只有fragment 可见才会调用onLazyLoad() 加载数据。

isPrepared参数在系统调用onActivityCreated时设置为true,这时onCreateView方法已调用完毕(一般我们在这方法里执行findviewbyid等方法),确保 onLazyLoad()方法不会报空指针异常。

isLazyLoaded确保ViewPager来回切换时BaseFragment的initData方法不会被重复调用,onLazyLoad在该Fragment的整个生命周期只调用一次,第一次调用onLazyLoad()方法后马上执行 isLazyLoaded = true。

然后再继承这个BaseMVPLazyFragment实现onLazyLoad() 方法就行。他会自动控制当fragment 展现出来时,才会加载数据

4.5 Fragment的方法setUserVisibleHint源码如下所示

通过此方法来设置Fragment的UI对用户是否可见,当该页面对用户可见/不可见时,系统都会回调此方法。

我们可以重写此方法,然后根据回调的isVisibleToUser参数来进行相关的逻辑判断,以达到懒加载的效果,比如如果isVisibleToUser==true的话表示当前Fragment对用户可见,此时再去加载页面数据。

5.懒加载Fragment为什么要继承BaseFragment5.1 继承BaseFragment好处这个BaseFragment就是最基础的基类了,里面进行一些最底层的设置,定义抽象函数:比如布局文件的绑定,初始化视图控件,初始化数据,初始化Toolbar

所以这个懒加载LazyLoadFragment基本上是隔离开了。耦合度相当低,基本都可以这样使用吧。

还有一点,有些Fragment不需要懒加载,那么可以直接继承BaseFragment类;需要懒加载的直接继承BaseMVPLazyFragment类

6.关于我的个人博客和站点

android 自定义域名,Android 懒加载优化相关推荐

  1. android 自定义域名,Android基于Retrofit2改造的可设置多域名的网络加载框架

    Android基于Retrofit2改造的可设置多域名的网络加载框架 1.使用说明 添加仓库 ``` allprojects { repositories { google() jcenter() m ...

  2. android预加载布局,Android 懒加载优化

    目录介绍 1.什么是懒加载 1.1 什么是预加载 1.2 懒加载介绍 1.3 懒加载概括 2.实际应用中有哪些懒加载案例 2.1 ViewPager+Fragment组合 2.2 分析源码 3.Vie ...

  3. Android多个fragment懒加载的坑(卡顿)

    在Android开发中,有很多种情况都是viewpage+fragment左右滑动进行布局的,例如下面的今日头条 在今日头条app上,我们可以看到,其顶部都是一栏的类型数据源,可滑动,可联动下面的vi ...

  4. webpack实现懒加载原理以及如何使用懒加载优化项目

    参考: 清晰易懂,可以先看这个:webpack的异步加载原理及分包策略 webpack中的懒加载代码原理解析:https://segmentfault.com/a/1190000020233387 自 ...

  5. vue-router 懒加载优化

    一.路由懒加载 1.先安装 babel 动态引入插件 npm install --save-dev babel-plugin-syntax-dynamic-import 2.修改router/inde ...

  6. JavaScript两个实用的图片懒加载优化方法

    文章目录 一.方法一 二.方法二 InterSectionObserver 一.方法一 重点: 1.getBoundingClientRect().top > window.innerHeigh ...

  7. android 标题栏进度圈使用方法,Android 自定义标题栏 显示网页加载进度的方法实例...

    这阵子在做Lephone的适配,测试组提交一个bug:标题栏的文字较长时没有显示完全,其实这并不能算个bug,并且这个问题在以前其他机器也没有出现,只是说在Lephone的这个平台上显示得不怎么美观, ...

  8. Android自定义简单的图片加载器(ImageLoader)

    废话不多述,首先来说明下 为什么要用图片加载器 呢,就是为了避免图片重复从网络加载.也就是在第一次从网络加载之后就把图片缓存在本地,下次用的时候直接从本地查找,有的话就直接用,没有再从网络加载. 加载 ...

  9. Android “退一步”的布局加载优化

    本文以授权个人公众号「鸿洋」原创首发. 1.概述 在Android开发过程中,我们基本每天都在写各种各样的xml布局文件,然后app会在运行时,将我们的布局文件转化成View显示在界面上. 这个转化, ...

最新文章

  1. hdu 1272 小希的迷宫
  2. HBuilder 模拟器连接默认端口
  3. C#的变迁史10 - C# 5.0 之其他增强篇
  4. TCP 三次握手和四次挥手个人理解
  5. linux 多网卡多路由表实现策略路由
  6. KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera
  7. 7. JavaScript HTML DOM - 改变 CSS
  8. C# ASP.NET里@的妙用
  9. 吴恩达深度学习笔记(归一化)
  10. 播放器:七牛播放器小记
  11. java8 131下载_jdk 8u131下载
  12. 模型机CPU设计——ALU函数发生器(6)
  13. 汽车超人:从电商到汽后新零售的华丽转身
  14. 【修复收藏功能、更新登录接口】知识付费小程序、博客小程序、完整版开源源码、资源变现小程序
  15. 获奖!CACTER邮件安全网关荣获电子邮件安全优秀产品奖项
  16. mysql存储过程学习笔记
  17. MySQL(一): 初涉MySQL
  18. Leetcode 703. Kth Largest Element in a Stream
  19. Windows 11 内置原生壁纸下载!
  20. 读稻盛和夫《活法》-现代人的修行之路

热门文章

  1. “安防+人工智能”,安企选择哪种抱大腿姿势才有出息?
  2. python 数据结构 1
  3. JSP——Web应用
  4. React-Native测试报告
  5. 好酷啊,真是图片吗?
  6. 802.11无线网络部署方案对比分析
  7. Windows rundll32的用法-批处理管理打印机
  8. (转)调用System.gc没有立即执行的解决方法
  9. 关于url传参中文乱码问题
  10. 【动态规划】【数位DP】[PA 2015]Rownanie