一航jason 2019-06-26
1.什么是懒加载
2.实际应用中有哪些懒加载案例
4.关于ViewPager与Fragment懒加载
1.1 什么是预加载
1.2 懒加载介绍
1.3 懒加载概括
//默认的缓存页面数量(常量) 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(); } }
3.2 分析源码可知
4.1 遇到的问题
4.2 主要的思路做法
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; } } }
4.4 onLazyLoad()加载数据条件
4.5 Fragment的方法setUserVisibleHint
5.1 继承BaseFragment好处