继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Fragment懒加载实现方案及原理

万千封印
关注TA
已关注
手记 90
粉丝 13
获赞 64

懒加载,又可称为延迟加载。目标与预加载正好相反,实现页面可见后再加载数据。看官们可根据自身业务需求自行斟酌

常见的应用情景:如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(),从方法名可理解为更新。

完活!

原文链接:http://www.apkbus.com/blog-35555-60410.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP