美文网首页
Android Fragment 懒加载

Android Fragment 懒加载

作者: 小小卒_oO_ | 来源:发表于2019-03-08 16:19 被阅读0次

ViewPager默认会去预加载当前页面前后的两个Fragment。
为了防止加载多个Fragment时出现切换卡顿,加载不可见Fragment初始化数据占用太多的资源。采用懒加载,实现预加载的轻量初始化,第一次可见状态才开始记载数据。把Fragment拆为可见和不可见2个生命状态。

主要使用Fragment的两个方法:
1.setUserVisibleHint(boolean isVisibleToUser),通过isVisibleToUser告诉我们当前Fragment是否可见。
2.getUserVisibleHint(),判断当前Fragment是否可见。

贴代码:

public abstract class BaseLazyFragment extends Fragment {

    protected Context mContext = null;
    /**
     * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复
     */
    private boolean isFirstResume = true;

    private boolean isFirstVisible = true;
    private boolean isFirstInvisible = true;
    private boolean isPrepared;

    /**
     * 设置此变量为true时不使用懒加载
     *
     * @param prepared
     */
    public void setPrepared(boolean prepared) {
        isPrepared = prepared;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initPrepare();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }

    @Deprecated
    @Override
    public void onResume() {
        super.onResume();
        if (isFirstResume) {
            isFirstResume = false;
            return;
        }
        if (getUserVisibleHint()) {
            onUserVisible();
        }
    }

    @Deprecated
    @Override
    public void onPause() {
        super.onPause();
        if (getUserVisibleHint()) {
            onUserInvisible();
        }
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            if (isFirstVisible) {
                isFirstVisible = false;
                initPrepare();
            } else {
                onUserVisible();
            }
        } else {
            if (isFirstInvisible) {
                isFirstInvisible = false;
                onFirstUserInvisible();
            } else {
                onUserInvisible();
            }
        }
    }

    private synchronized void initPrepare() {
        if (isPrepared) {
            onFirstUserVisible();
        } else {
            isPrepared = true;
        }
    }

    /**
     * 第一次fragment可见(进行初始化工作)
     */
    protected void onFirstUserVisible() {

    }

    /**
     * fragment可见(切换回来或者onResume)
     */
    private void onUserVisible() {

    }

    /**
     * 第一次fragment不可见(不建议在此处理事件)
     */
    private void onFirstUserInvisible() {

    }

    /**
     * fragment不可见(切换掉或者onPause)
     */
    private void onUserInvisible() {

    }

}
  • 请求数据的操作放在onFirstUserVisible()方法中去实现,可以有效的避免卡顿.
  • setUserVisibleHint()在Fragment所有生命周期之前。
  • viewPager.setOffscreenPageLimit(10);//预加载10个Fragment
    这个方法用来设置预加载页面数量,设置0和1是同样的效果,默认不设置数量的情况下预加载下一页。所以懒加载用这个方法无效。

相关文章

网友评论

      本文标题:Android Fragment 懒加载

      本文链接:https://www.haomeiwen.com/subject/lkdrpqtx.html