关于Fragment+viewpager的取消预加载(懒加载)

       好久没写文章了,最近在做新的项目,就拖在现在整个项目差不多在维护阶段了,所以最近时间比较闲。现在我在项目中遇到的一些问题总结一下。可能我们的项目中会有Fragment+viewpager这种组合,但是一个Activity加载几个fragment进行切换时,会出现一种预加载的情况,也就是说一进这个activity界面就会同时加载几个fragment的数据,如果是这样我们就会浪费一些流量资源,显然是不好的。所以我找到了解决的方法,几行代码就能实现这种单个加载数据。这种原理主要是用的fragment里的setUserVisibleHint方法,隐藏或者展示。看一下它的源码:

/**
     * Set a hint to the system about whether this fragment's UI is currently visible
     * to the user. This hint defaults to true and is persistent across fragment instance
     * state save and restore.
     *
     * <p>An app may set this to false to indicate that the fragment's UI is
     * scrolled out of visibility or is otherwise not directly visible to the user.
     * This may be used by the system to prioritize operations such as fragment lifecycle updates
     * or loader ordering behavior.</p>
     *
     * @param isVisibleToUser true if this fragment's UI is currently visible to the user (default),
     *                        false if it is not.
     */
    public void setUserVisibleHint(boolean isVisibleToUser) {
        if (!mUserVisibleHint && isVisibleToUser && mState < STARTED
                && mFragmentManager != null && isAdded()) {
            mFragmentManager.performPendingDeferredStart(this);
        }
        mUserVisibleHint = isVisibleToUser;
        mDeferStart = mState < STARTED && !isVisibleToUser;
    }

     好了我们先定义一个父BaseFragment,在这里面我们定义一些方法,

protected boolean isVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(getUserVisibleHint()) {
        isVisible = true;
        onVisible();
    } else {
        isVisible = false;
        onInvisible();
    }
}

protected void onVisible(){
    lazyLoad();
}

protected  void lazyLoad(){};

protected void onInvisible(){};

      然后我们在子fragment里定义一个全局变量private booleanisPrepared;在Fragment中的onCreateView方法中加入isPrepared=true;lazyLoad();

   再重写lazyLoad()方法,

@Override

protected void lazyLoad() {
    if(!isPrepared || !isVisible) {
        return;
    }
    data();
}
这里的data()方法是我定义的一个方法,里面主要是放的请求数据的方法。这样就能取消这种预加载。
  下载代码
 

    

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值