为什么要进行懒加载
一个优秀的APP在流畅性一定要做到不卡顿、没有跳帧、就算等待请求网络也要有动画让用户不会觉得死机。那么这一期我会在Fragment里进行懒加载,只有当页面显示的时候才被加载,不显示时让资源及时得到释放。
如果每个 Fragment 都有默认的网络请求操作(也可能是其它耗时操作,这里以网络请求为例),那么多个在 Fragment创建过程中都会执行默认网络请求,无论 Fragment 是否对用户可见,显然有些浪费流量、影响性 App 性能、用户体验不佳等缺点,这些自然不是我们想看到的,出于这些原因,让 Fragment 进行数据懒加载就有必要了。
那么懒加载的好处是什么呢
懒加载好处
- 减少了加载时县城数量,使可视区域内的图片也能够快速加载,优化了用户体验;
- 减少了同一时间发向服务器的请求数,服务器压力剧减;
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的懒加载这实现啦
代码
大家看完如果觉得还可以,希望给小弟点个赞哦,你们的支持是我创作的动力