抓住人生中的一分一秒,胜过虚度中的一月一年!
前言
在实际开发中,fragment使用经常会结合viewpager一起使用,页面可能会由三个或更多Fragment构成,每个fragment可能都是由复杂的布局结构所组成,这个时候直接加载出来,或是默认加载两三个都是有点耗费资源的,可能还会比较卡顿,所以懒加载这一名词就会提上议程
对于懒加载,通俗点讲就是看不见的不需要的不加载,当需要时再进行加载,让体验(页面绘制),流量等更节省
思路(其实很简单,思路明确了很好理解)
fragment中有一个setUserVisibleHint函数,此函数含义为 “当fragment被用户可见时,setUserVisibleHint()会调用且传入true值,当fragment不被用户可见时,setUserVisibleHint()则得到false值。”
了解了这个函数之后,稍微封装一下不就实现了懒加载了吗?
实现目标
1、布局初始化后,才能加载数据
2、界面是否可见后,才能加载数据
3、是否加载过数据,如果加载过,就不重复加载
4、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)
实现步骤
1、布局初始化后进行加载数据
/** * 是否初始化过布局 */ protected boolean isViewInitiated; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); isViewInitiated=true; //加载数据方法 prepareFetchData(); }
2、界面可见了加载数据
/** * 当前界面是否可见 */ protected boolean isVisibleToUser; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); this.isVisibleToUser = isVisibleToUser; if (isVisibleToUser) { prepareFetchData(); } }
3、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)
public void prepareFetchData() { prepareFetchData(false); }
4、加载过数据,就不重复加载
/** * 是否加载过数据 */ protected boolean isDataInitiated; public void prepareFetchData(boolean forceUpdate) { if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) { loadData(); isDataInitiated = true;//不再重复加载 } }
5、加载数据
/** * 判断懒加载条件 * * @param forceUpdate 强制更新,没啥用 */ public void prepareFetchData(boolean forceUpdate) { if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) { loadData(); isDataInitiated = true; } } /** * 懒加载 */ protected abstract void loadData();
下面介绍下子类Fragment如何使用
public class TextFragment extends BaseFragment{ @Override protected BasePresenter createPresenter() { return null; } @Override protected int getLayoutId() { return R.layout.fragment_base; } @Override protected void initData() { } @Override protected void loadData() { //加载数据 } }
全部BaseFragment代码如下
/** * File descripition: * * @author lp * @date 2019/3/15 */ public abstract class BaseFragment extends Fragment { public View view; public Activity mContext; /** * 是否初始化过布局 */ protected boolean isViewInitiated; /** * 当前界面是否可见 */ protected boolean isVisibleToUser; /** * 是否加载过数据 */ protected boolean isDataInitiated; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(getLayoutId(), container, false); ButterKnife.bind(this, view); mContext = getActivity(); this.initData(); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); isViewInitiated=true; //加载数据 prepareFetchData(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); this.isVisibleToUser = isVisibleToUser; if (isVisibleToUser) { prepareFetchData(); } } public void prepareFetchData() { prepareFetchData(false); } /** * 判断懒加载条件 * * @param forceUpdate 强制更新,好像没什么用? */ public void prepareFetchData(boolean forceUpdate) { if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) { loadData(); isDataInitiated = true; } } /** * 懒加载 */ protected abstract void loadData(); /** * 获取布局ID * * @return */ protected abstract int getLayoutId(); /** * 数据初始化操作 */ protected abstract void initData(); @Override public void onDestroy() { super.onDestroy(); this.view = null; } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.bind(getActivity()).unbind(); } /** * [页面跳转] * * @param clz */ public void startActivity(Class<?> clz) { startActivity(clz, null); } /** * [携带数据的页面跳转] * * @param clz * @param bundle */ public void startActivity(Class<?> clz, Bundle bundle) { Intent intent = new Intent(); intent.setClass(getActivity(), clz); if (bundle != null) { intent.putExtras(bundle); } startActivity(intent); } /** * [含有Bundle通过Class打开编辑界面] * * @param cls * @param bundle * @param requestCode */ public void startActivityForResult(Class<?> cls, Bundle bundle, int requestCode) { Intent intent = new Intent(); intent.setClass(getActivity(), cls); if (bundle != null) { intent.putExtras(bundle); } startActivityForResult(intent, requestCode); } }
最后,祝大家创作愉快