本人小菜鸟一枚, 并且记性十分不好, 所以在此把自己用过的东西记录一下, 以免长时间不用的话会忘记, 如果有哪里写的不对的地方, 希望各位大佬多多指正, 以免误导后面的童鞋,不胜感激!
fragment的懒加载,顾名思义,就是在用到这个fragment的时候才把它的内容加载出来.这样可以防止一次同时加载大量不必要的资源,减少流量的消耗,在一定程度上提高我们APP的运行效率.
如何实现懒加载呢?首先要满足两个条件:
一,视图已经创建. 二,该fragment对用户处于可见状态.
只有同时满足了这两个条件,我们才允许该fragment去加载数据.
首先我们新建一个抽象类去继承Fragment类.
public abstract class MyBaseFragment extends Fragment {
private boolean isViewCreated;//视图是否已经创建
private boolean isUiVisible;//该fragment是否对用户可见
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated = true;
lazyLoad();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
isUiVisible = true;
lazyLoad();
}else{
isUiVisible = false;
}
}
private void lazyLoad() {
//这里进行双重标记判断,是因为setUserVisibleHint会多次回调,
// 并且会在onCreateView执行前回调,必须确保onCreateView加载完毕且页面可见,才加载数据
if (isViewCreated && isUiVisible) {
lazyLoadData();
//数据加载完毕,恢复标记,防止重复加载
isViewCreated = false;
isUiVisible = false;
}
}
protected abstract void lazyLoadData();
@Override
public void onDestroyView() {
super.onDestroyView();
isViewCreated = false;
isUiVisible = false;
}
}
在 onViewCreated 方法中将变量isViewCreated置为true ( 该方法表示视图已经创建完毕 ) , 在 setUserVisibleHint 方法中将isUiVisible 置为true. ( 该方法表示当前fragment对用户是否可见 ) . 然后在 lazyload 方法中, 判断当两个变量同时为true时, 就执行lazyLoadData方法, 也就是加载数据的方法 . 然后在我们需要用到懒加载的Fragment中继承 MyBaseFragment 并实现 lazyLoadData 方法即可.
public class TabFragment extends MyBaseFragment {
@Override
protected void lazyLoadData() {
//在这里加载数据....
}
以上就实现了 fragment 的懒加载, 哪里写的不对或者不严谨, 希望大佬们帮忙指正下, 万分感激!!!