1.懒加载介绍

1.1.效果预览

  

1.2.效果讲解

  当页面可见的时候,才加载当前页面。

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

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

1.3.懒加载文章传送门

  参考文章:Android懒加载。

  参考文章:Android开发技巧-懒加载。

1.4.懒加载的意义以及使用原因

  我们在使用viiewpage与多个Fragment组合使用的时候,如果每个fragment都需要加载数据,或从本地加载,

  或从网络加载,那么在这个activity刚创建的时候就需要初始化大量资源。

  viewpager默认一次加载当前页面前后两个页面,即使设置setofflimit(0)也没有效果,这就是预加载。

  这样把我们看不到的页面的数据也加载了,大大降低了性能,浪费初始化资源。

  如果我们采用懒加载技术,只让用户看到的页面才会加载需要的数据,这样也更加人性化,也大大提高效率。

2.使用懒加载的方法

2.1.按照每个人的需求可能不一样,但是核心是一样的。

  那就是这个setUserVisibleHint函数。 

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//执行逻辑代码
}

  这个函数的作用就是: 

当fragment被用户可见时,setUserVisibleHint()会调用且传入true值,
当fragment不被用户可见时,setUserVisibleHint()则得到false值。
而在传统的fragment生命周期里也看不到这个函数。

  可以参考这篇文章:Fragment的setUserVisibleHint详解。

2.2.简单的一个案例==>当Fragment可见的时候执行一个抽象函数来加载数据。

public abstract class LazyLoadFragment extends BaseFragment {

    protected boolean isViewInitiated;//判断视图是否初始化
protected boolean isVisibleToUser;//用户是否可见
protected boolean isDataInitiated;//数据是否初始化 @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
prepareFetchData();
} //在所有生命周期函数之前调用,查看是否可见
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
prepareFetchData();
} //定义一个抽象函数,在子类中实现,作用就是加载初始化数据
public abstract void fetchData(); //准备加载数据,这里不是强制刷新
public boolean prepareFetchData() {
return prepareFetchData(false);
} //用户强制刷新的话,就应该是用户主动进行刷新了,当然也要去取数据了,用户第一嘛
public boolean prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
fetchData();
isDataInitiated = true;
return true;
}
return false;
} }

  解释一下:这个BaseFragment就是最基础的基类了,里面进行一些最底层的设置,定义抽象函数:

          比如布局文件的绑定,初始化视图控件,初始化数据,初始化Toolbar

  所以这个懒加载LazyLoadFragment基本上是隔离开了。

  耦合度相当低,基本都可以这样使用吧。

3.总结一下吧

3.1.viewpager监听切换tab事件,tab切换一次,执行一次setUserVisibleHint方法。

3.2.setUserVisibleHint()在fragmetn所有生命周期之前,无论viewpager是在activity哪个生命周期里初始化的。

3.3.activity生命周期和fragment生命周期时序并不是按序来的,因为执行速度很快,嗖的一下就执行完了。

  所以fragment的onCreate方法时序并不一定在activity的onCreate方法之后。

  这就是为什么我调试的时候,编译器老是不按照常理的顺序来,一下子跳这儿,一下那儿的。

3.4.最后看一下Activity和Fragment的生命周期图解吧。

  

Android 懒加载简单介绍的更多相关文章

  1. Android ndk 加载简单的gif 图像

    首先获取一个安卓权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> ...

  2. hexo next主题深度优化(二),懒加载。

    文章目录 tip:没有耐心的可以直接看:正式在hexo next中加入懒加载(最下面) 废话 背景 懒加载简单介绍 引入js 重点!敲黑板了!!! 完善懒加载函数 懒加载函数可配置的参数 正式在hex ...

  3. vue的路由懒加载

    路由懒加载官方介绍 非懒加载写法: import Login from '@/components/Login' 所有路由涉及到的文件会被打包到 app.xxx.js 中 懒加载写法: const L ...

  4. swift学习第十六天:懒加载和tableView

    懒加载 懒加载的介绍 swift中也有懒加载的方式 (苹果的设计思想:希望所有的对象在使用时才真正加载到内存中) 和OC不同的是swift有专门的关键字来实现懒加载 lazy关键字可以用于定义某一个属 ...

  5. vue路由懒加载及组件懒加载

    一.为什么要使用路由懒加载 为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题. 二.定义 懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载. 三.使用 常用的懒加载方式 ...

  6. vue中页面卡顿,使用懒加载

    为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题. 懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载. 常用的懒加载方式有两种:即使用vue异步组件 和 ES中的imp ...

  7. 【Android】Fragment懒加载和ViewPager的坑

    效果 老规矩,先来看看效果 ANDROID和福利两个Fragment是设置的Fragment可见时加载数据,也就是懒加载.圆形的旋转加载图标只有一个,所以,如果当前Fragment正处于加载状态,在离 ...

  8. 【Android】再来一篇Fragment懒加载(只加载一次哦)

    效果 老规矩,先来看看效果图 没错,我又入坑了,又重新做了个 Gank 客户端,因为之前那个代码写得太烂了,这次有好好的考虑了下架构之类的事,代码应该会更容易读懂了点了,吧.哈哈,再次欢迎来 star ...

  9. jquery实现简单瀑布流布局(续):图片懒加载

    # jquery实现简单瀑布流布局(续):图片懒加载 这篇文章是jquery实现简单瀑布流布局思想的小小扩展.代码基于前作的代码继续完善. 图片懒加载就是符合某些条件时才触发图片的加载.最常见的具体表 ...

随机推荐

  1. Python中open文件的各种打开模式

    对于Python打开文件的模式,总是记不住,这次在博客里记录一下 r+: Open for reading and writing.  The stream is positioned  at  th ...

  2. 给大家推荐一个.Net的混淆防反编译工具ConfuserEx

    给大家推荐一个.Net的混淆防反编译工具ConfuserEx. 由于项目中要用到.Net的混淆防反编译工具. 在网上找了很多.Net混淆或混淆防反编译工具,如.NET Reactor.Dotfusca ...

  3. Linux改变文件属性与权限

    chgrp:改变文件所属用户组 chown:改变文件所有组 chmod:改变文件的权限 一.chgrp(change group的简称) 修改文件所属组:eg:chgrp users install. ...

  4. 【转载】SQL执行计划

    要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. ...

  5. "ssllabs" website and "testssl" website

    "https://www.ssllabs.com" could scan your server and give results about the weakness of yo ...

  6. js报变量 is not a function

    是变量名和函数名相同导致的 比如: function a(){} var a = a();

  7. 【[TJOI2018]碱基序列】

    题目 为什么没人用\(SAM\)啊 我们先把原来的模式串建一遍\(SAM\),之后我们就可以求出\(SAM\)上每一个节点的\(|endpos|\)就可以知道每一个子串出现的次数了,也就是在模式串上的 ...

  8. Netbackup-Oracle数据库恢复演练(上)

    目录 第一章NBU实施内容 1 第二章 环境准备 1 2.1添加LICENSE: 1 2.2安装配置NBU客户端(linux,unix相同) 2 2.3配置并验证oracle备份脚本 3 2.4添加备 ...

  9. 某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P、V操作给出小和尚、老和尚动作的算法描述。

    寺庙和尚打水 设信号量mutex_gang, mutex_jing, gang_empty, gang_full, count分别表示使用缸互斥, 使用井互斥, 缸空, 缸满, 水桶总个数 semap ...

  10. 第42章 电源管理—实现低功耗—零死角玩转STM32-F429系列

    第42章     电源管理—实现低功耗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...