懒加载,又可称为延迟加载。目标与预加载正好相反,实现页面可见后再加载数据。看官们可根据自身业务需求自行斟酌
常见的应用情景:如ViewPager内包含Fragment结构,需要在Fragment被展示之后再去加载数据。而通常我们用的ViewPager,配合FragmentPagerAdapter会默认实现预加载,就是在我们还没看见第一页以后的页面时,后面的页面就已经在加载数据了。那我们现在要做相反的事情,怎么实现?
既然问题来源是ViewPager跟FragmentPagerAdapter,那我们就从这俩入手。源码就不展示了,感兴趣的自行追踪
本质:setUserVisibleHint(Boolean)方法 ,此方法为Fragment所特有,可以用来控制Fragment可见状态,我们的Adapter做的预加载就用到了该方法,我们也来用它
注意:setUserVisibleHint通常会调用在Fragment生命周期过程中,为避免资源、View对我们的操作产生影响,我们用一个变量来确认Fragment是否初始化完成。
看实现:
[代码]java代码:
boolean isVisibleToUser;
private void onUserVisible(){
onLazyLoad();
}
public abstract void onLazyLoad();
/**
*设置Fragment可视状态
*该方法在Fragment生命周期中的 onCreateView之前执行
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
if(isVisibleToUser){
onUserVisible();
}
}
Fragment实现逻辑
[代码]java代码:
boolean isViewPrepared ;//标记UI初始化状态
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Fragment内的View初始化逻辑
isViewPrepared = true;//视图已经准备好
onLazyLoad();//这里执行一下数据加载
return view;
}
public void onLazyLoad() {
if (!isViewPrepared || !isVisibleToUser) {//UI没初始化成功或Fragment不可见时
return;
}
//执行数据加载逻辑,及UI操作
}我们需要手动控制Fragment显示状态:
Fragment.setUserVisibleHint(true);
根据业务情况,我们可能还需要在FragmentTransaction成功后再设置可见
下面是ViewPager内可用来实现懒加载方法原理的简单追踪思路:
Adapter初始化 instantiateItem方法在一系列的Fragment逻辑添加时,对非当前项设为不可见状态,
通过setPrimaryItem方法向外暴露访问,对需要可见的Fragment设置可见。
在ViewPager中,通过当前Adapger提供的 setPrimaryItem() 方法对Fragment可视状态进行改变
而触发该动作的方法为 populate(),从方法名可理解为更新。
完活!
随时随地看视频