Fragment 懒加载

Fragment 懒加载

什么时候需要懒加载?

这个情况一般存在于ViewPage中使用使用FragmentPagerAdapter,使用ViewPage加载大量的Fragment,由于ViewPage会预先加载Fragment导致没有显示的Fragment会在后台预先加载,造成流量浪费。

原理

主要靠的是Fragmentvoid setUserVisibleHint(boolean isVisibleToUser)方法
ViewPage 在设置当前视图是会调用 adapter.setPrimaryItem(ViewGroup container, int position, Object object) 的方法,FragmentPagerAdapter中调用FragmentsetUserVisibleHint方法

    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment)object;
        if (fragment != mCurrentPrimaryItem) {
            if (mCurrentPrimaryItem != null) {
                mCurrentPrimaryItem.setMenuVisibility(false);
                mCurrentPrimaryItem.setUserVisibleHint(false);
            }
            if (fragment != null) {
                fragment.setMenuVisibility(true);
                fragment.setUserVisibleHint(true);
            }
            mCurrentPrimaryItem = fragment;
        }
    }

注意事项
setUserVisibleHint方法,在onCreateView之前调用
如果在setUserVisibleHint,操作View(显示Loading)可能会出现空指针,因为还没有创建View所以要考虑在onCreateView之后
setUserVisibleHint 生命周期关系

实现

设置标记位,重写FragmentsetUserVisibleHint

public abstract class LazyFragment extends BaseFragment {
    protected boolean isViewCreated = false;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getUserVisibleHint() && isViewCreated) {
            //当前可见
            onVisible();
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        isViewCreated = true;
    }

    /**
     * fragment 在当前窗口显示
     * 可以执行数据加载
     */
    protected abstract void onVisible();
}

可以再 github 上看看代码,可以看下具体的生命周期

参考
Andriod开发技巧——Fragment的懒加载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值