Fragment懒加载(一)

简介: 用多viewpager+fragment的朋友都知道viewpager有预加载机制,如果你每个页面都有请求网络的操作,那么只显示第一个页面就去加载完所有页面的网络数据也不好。

用多viewpager+fragment的朋友都知道viewpager有预加载机制,如果你每个页面都有请求网络的操作,那么只显示第一个页面就去加载完所有页面的网络数据也不好。那怎么办呢,有的朋友说那就不用viewpager,那更不行,物品就是因为Viewpager有缓存机制才用它的。于是我们换种思路,在fragment上动手脚,所以就有了懒加载这个说法。

其实懒加载的核心来自与fragment中的一个方法setUserVisibleHint,这个方法只有在从隐藏到显示和从显示到隐藏才会调用,而getUserVisibleHint()这个方法能返回显示/隐藏状态。

之前我在网上找了一些别人写的,很多都写得看着不是很好,但是我找到了一个写得挺不错的,比较符合viewpager+fragment这种情况。

public abstract class BaseLazyFragment extends BaseFragment {
/**
 * 懒加载过
 */
private boolean isLazyLoaded;

private boolean isPrepared;

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    isPrepared = true;
    //只有Fragment onCreateView好了,
    //另外这里调用一次lazyLoad()
    lazyLoad();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    lazyLoad();
}

/**
 * 调用懒加载
 */

private void lazyLoad() {
    if (getUserVisibleHint() && isPrepared && !isLazyLoaded) {
        onLazyLoad();
        isLazyLoaded = true;
    }
}

@UiThread
public abstract void onLazyLoad();
}

这是他写的代码,要判断是否请求网络数据有三个条件,是否第一次加载,是否是显示状态和基本组件是否已经初始化完成。

他的写法和我所想的思路一样,那我就不再花时间自己封一个,就用这个代码来讲。
首先肯定只有第一次显示才请求网络吧,之后再显示都不请求,所以要在第一次请求网络之后吧isLazyLoaded变为true。
然后对于第一个页面来说,setUserVisibleHint是在onActivityCreated方法之前,所以要在onActivityCreated方法中再进行一次请求网络的操作。
这样讲应该能明白这段代码的意思。其实做法有很多种,不一定要这样写,但是思路我觉得就是这样。

目录
相关文章
|
4月前
|
API 开发者
懒加载的实现
懒加载的实现
194 57
|
5月前
|
前端开发 JavaScript
3分钟掌握!用HTML+CSS实现懒加载,真的这么简单?
3分钟掌握!用HTML+CSS实现懒加载,真的这么简单?
|
数据采集 搜索推荐 UED
实现懒加载
懒加载是一种非常 useful 的技术,可以极大提高用户体验和网页性能,但也有一定的弊端,需要权衡选择。一般来说,对于加载的数据较多,页面性能和流量较为关注的场景,懒加载是一个不错的方案。但如果对 SEO 优化要求较高,或者加载的数据较少,也可以不使用懒加载
77 0
Fragment懒加载实现,BaseFragment封装
Fragment懒加载实现,BaseFragment封装
123 0
|
XML 移动开发 Android开发
activity中加载fragment的控件]
fragment它自己的中文意思:碎片; 一个可以将activity拆分成几个完全独立封装的可重用的组件,每个组件有自己的生命周期和ui布局。
316 1
activity中加载fragment的控件]
PagerFragmentAdapter中Fragment的懒加载问题
严格来说来说不是类的懒加载,而是针对业务中的特殊需求实现的,让fragment在可见的时候再进行网络请求。 在viewpager+PagerFragentAdapter里面的Fragment里面,初次加载时,offset范围内的所有fragment的oncreateView方法都会执行,默认情况下,fragment原有的逻辑中,页面的初始化和网络请求都会触发,这就会导致初次进入时,即使在用户面前只展示了一个tab和fragment,但是却所有tab下页面的数据都请求了,会浪费用户流量。正确的做法是在用户打开fragment之后才请求数据。
|
缓存
ViewPager的缓存机制和懒加载实现
ViewPager的缓存机制和懒加载实现
|
缓存 Android开发
android Fragment单页面加载,避免重复加载(懒加载)分析
android Fragment单页面加载,避免重复加载(懒加载)分析
|
Java
为Fragment也写一个ViewInject
title: 为Fragment也写一个ViewInject date: 2018-10-28 11:29:51 tags: fragment ViewInject 1.简介 鸿洋博客:https://blog.csdn.net/lmj623565791/article/details/39269193 前段时间根据鸿洋的博客,写了一个ViewInject,本以为可以和findViewById说再见了,但是今天在fragment中使用ViewInject,却报了空指针的错误,原来是控件没有实例化就调用了。
1149 0
Fragment懒加载(四) 与 EditText在PopupWindow上的BUG
这篇讲两个内容,因为感觉内容都太少了,所以就合起来写一篇算了。 一.Fragment懒加载(四)对Fragment的封装 我之前写过一篇文章说过要实现Fragment的懒加载,要定义3个参数,如果进行懒更新的话还要加一个参数,所以想想如果你的每个fragment都要定义4个参数,至少我觉得这样的代码扩展性不是很好,所以我就写了个LazyFragment对懒加载的操作进行封装。
1139 0

热门文章

最新文章