懒加载,又可称为延迟加载。目标与预加载正好相反,实现页面可见后再加载数据。看官们可根据自身业务需求自行斟酌
常见的应用情景:如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(),从方法名可理解为更新。
完活!