网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

Android优化方案之Fragment的懒加载实现代码

一、背景

创新互联-专业网站定制、快速模板网站建设、高性价比云南网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式云南网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖云南地区。费用合理售后完善,10余年实体公司更值得信赖。

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

举个栗子:

Android优化方案之Fragment的懒加载实现代码

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

Android优化方案之Fragment的懒加载实现代码

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

二、实现Fragment懒加载

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

Android优化方案之Fragment的懒加载实现代码

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

public void setUserVisibleHint(boolean isVisibleToUser)

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

Android优化方案之Fragment的懒加载实现代码

只有可见时,我们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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。


新闻名称:Android优化方案之Fragment的懒加载实现代码
URL网址:http://bjjierui.cn/article/pioocp.html

其他资讯