场景分析
当一个 MainActivity 对应显示3个 Fragment 时,假设默认显示第一个Fragment,那么第二和第三个Fragment的数据就可以延迟加载。如果加载数据比较耗时或者都是类似图片的占用大量内存,这时就应该考虑想想是否该实现懒加载。也就是,当我打开哪个Fragment的时候,它才会去加载数据。
解决方案
第一步(封装):先封装一个父类,方便复用,代码比较简单,里面都有注释,SO,直接上代码吧!
public abstract class BaseLazyFragment extends Fragment {
// 标志位,标志已经初始化完成。
protected boolean isPrepared;
//判断数据是否加载过,防止数据重复加载
protected boolean isLoad;
protected boolean isVisible;
protected abstract void lazyLoad();//子类实现
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
View mRootView = inflater.inflate(getLayoutId(), container, false);
return mRootView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isPrepared = true;
lazyLoad();
}
/**
* 在这里实现Fragment数据的缓加载.
*/
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {//当可见的时候执行的操作
isVisible = true;
onVisible();
} else {//不可见时执行的操作
isVisible = false;
onInvisible();
}
}
protected void onVisible() {
lazyLoad();
}
protected void onInvisible() {
}
}
第二步(使用)
public class ClientFragment extends BaseLazyFragment {
@Override
protected void lazyLoad() {
if (isPrepared && isVisible && !isLoad) {
isLoad = true;//在此将isLoad 设置为 true ,防止数据重复加载
//To do something.
}
}
}
记录下遇到问题的解决办法,一是方便自己日后查看,二是希望能帮助遇到此问题的朋友能快速解决问题。