Android面试我收藏的Android开发文章优化

Android 懒加载优化

2018-02-27  本文已影响268人  杨充211

目录介绍

0.前言介绍

1.什么是懒加载

2.实际应用中有哪些懒加载案例

3.ViewPager中setOffscreenPageLimit(int limit)相关源码

//默认的缓存页面数量(常量)
private static final int DEFAULT_OFFSCREEN_PAGES = 1;

//缓存页面数量(变量)
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;

public void setOffscreenPageLimit(int limit) {
    //当我们手动设置的limit数小于默认值1时,limit值会自动被赋值为默认值1(即DEFAULT_OFFSCREEN_PAGES)
    if (limit < DEFAULT_OFFSCREEN_PAGES) {
        Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "+ DEFAULT_OFFSCREEN_PAGES);
        limit = DEFAULT_OFFSCREEN_PAGES;
    }

    if (limit != mOffscreenPageLimit) {
        //经过前面的拦截判断后,将limit的值设置给mOffscreenPageLimit,用于
        mOffscreenPageLimit = limit;
        populate();
    }
}

4.关于ViewPager与Fragment懒加载

public abstract class BaseMVPLazyFragment<T extends IBasePresenter> extends BaseMVPFragment<T> {
    /**
    * Fragment的View加载完毕的标记
    */
    protected boolean isViewInitiated;
    /**
    * Fragment对用户可见的标记
    */
    protected boolean isVisibleToUser;
    /**
    * 是否懒加载
    */
    protected boolean isDataInitiated;

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

    /**
    * 第一步,改变isViewInitiated标记
    * 当onViewCreated()方法执行时,表明View已经加载完毕,此时改变isViewInitiated标记为true,并调用lazyLoad()方法
    */
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isViewInitiated = true;
        //只有Fragment onCreateView好了,
        //另外这里调用一次lazyLoad()
        prepareFetchData();
        //lazyLoad();
    }

    /**
    * 第二步
    * 此方法会在onCreateView()之前执行
    * 当viewPager中fragment改变可见状态时也会调用
    * 当fragment 从可见到不见,或者从不可见切换到可见,都会调用此方法
    */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        prepareFetchData();
    }

    /**
    * 第四步:定义抽象方法fetchData(),具体加载数据的工作,交给子类去完成
    */
    public abstract void fetchData();

    /**
    * 第三步:在lazyLoad()方法中进行双重标记判断,通过后即可进行数据加载
    * 第一种方法
    * 调用懒加载,getUserVisibleHint()会返回是否可见状态
    * 这是fragment实现懒加载的关键,只有fragment 可见才会调用onLazyLoad() 加载数据
    */
    private void lazyLoad() {
        if (getUserVisibleHint() && isViewInitiated && !isDataInitiated) {
            fetchData();
            isDataInitiated = true;
        }
    }

    /**
    * 第二种方法
    * 调用懒加载
    */
    public void prepareFetchData() {
        prepareFetchData(false);
    }

    /**
    * 第三步:在lazyLoad()方法中进行双重标记判断,通过后即可进行数据加载
    */
    public void prepareFetchData(boolean forceUpdate) {
        if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
            fetchData();
            isDataInitiated = true;
        }
    }
}

5.懒加载Fragment为什么要继承BaseFragment

6.关于我的个人博客和站点

上一篇下一篇

猜你喜欢

热点阅读