Fragment懒加载的原理与实现

为什么要进行懒加载

一个优秀的APP在流畅性一定要做到不卡顿、没有跳帧、就算等待请求网络也要有动画让用户不会觉得死机。那么这一期我会在Fragment里进行懒加载,只有当页面显示的时候才被加载,不显示时让资源及时得到释放。

如果每个 Fragment 都有默认的网络请求操作(也可能是其它耗时操作,这里以网络请求为例),那么多个在 Fragment创建过程中都会执行默认网络请求,无论 Fragment 是否对用户可见,显然有些浪费流量、影响性 App 性能、用户体验不佳等缺点,这些自然不是我们想看到的,出于这些原因,让 Fragment 进行数据懒加载就有必要了。

那么懒加载的好处是什么呢

懒加载好处

  1. 减少了加载时县城数量,使可视区域内的图片也能够快速加载,优化了用户体验;
  2. 减少了同一时间发向服务器的请求数,服务器压力剧减;

Fragment懒加载实现的原理

学一样东西我们必须要向它的原理下手,OK!那么现在我们往上翻一翻!经过查看 ViewPager 的源码,我发现一个核心的方法 populate()
在这里插入图片描述
里面有这一段代码是用来设置缓存范围,比如总共有5个页面,设置了缓存大小是1(就是这个mOffscreenPageLimit参数),当前所有的位置是最0的话,那么缓存的就系1;当用户滑到1的时候缓存的则是0、1、2,滑到最右的时候缓存的就 3、4;
我用下面三幅图来描述一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们继续往下看,发现有两行代码,分别是PagerAdapter的 destroyItem()和 setPrimaryItem()方法,destroyItem方法主要是用来删除超出缓存位置的Fragment,由FragmentPagerAdapter具体实现。
在这里插入图片描述
setPrimaryItem()方法就系我们的重点,它里面进行非常重要的操作
在这里插入图片描述
最后在调用adapter的finishUpdate进行更新。

懒加载的实现

ok!上面我们知道了实现Fragment懒加载最重要的方法就是我们Fragment里面的setUserVisibleHint(),所以我们第一步肯定是在这方法里面做文章。

//  控制 是否可见
 	override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isViewCreated){//判断layout 是否已经创建
            if (isVisibleToUser && !isCurrentVisibleState){//如果传进来的是true,之前保存状态是不可见,那么分发的就是可见事件,让页面可以进行网络加载
                dispatchUserVisibleHint(true)
            }else if (isCurrentVisibleState && !isVisibleToUser){//如果传进来的是false,之前保存状态是可见,那么分发的就是不可见事件,让页面可以进行网络停止加载
                dispatchUserVisibleHint(false)
            }
        }
    }

 	fun dispatchUserVisibleHint(isVisibleToUser: Boolean){
        if (isCurrentVisibleState == isVisibleToUser){//如果是相同的状态则return
            return
        }
        isCurrentVisibleState = isVisibleToUser //保存当前的状态,以免进行二次分发
        if (isVisibleToUser){
            onFragmentLoad()
        }else{
            onFragmentLoadStop()
        }
    }

    /** =======================================
     *            触发停止加载网络
     *========================================= */
 	public open fun onFragmentLoadStop(){
		//这里不将他抽象方法,是让子类自行的选择
    }

    /** =======================================
     *               触发加载网络
     *========================================= */
 	public open fun onFragmentLoad(){
		//这里不将他抽象方法,是让子类自行的选择
    }

我们通过观察 log打印没有问题
在这里插入图片描述
到这里Fragment的懒加载这实现啦

代码

GitHub

大家看完如果觉得还可以,希望给小弟点个赞哦,你们的支持是我创作的动力

猜你喜欢

转载自blog.csdn.net/karsonNet/article/details/103650581