一、懒加载的目的
在ViewPager 嵌套Fragment中,ViewPager会自动实现预加载,在 Fragment创建过程中都会执行默认网络请求,无论Fragment是否对用户可见,显然有些浪费流量、影响性 App 性能、用户体验不佳等缺点。为解决上述问题,需实现Fragment仅在用户可见的状态下加载网络数据。
二、懒加载实现方案
Fragment有一个非生命周期的setUserVisibleHint(boolean isVisibleToUser)回调方法,当 ViewPager嵌套 Fragment 时会起作用,如果切换 ViewPager 则该方法也会被调用,参数isVisibleToUser为true代表当前 Fragment 对用户可见,否则不可见。
setUserVisibleHint(boolean isVisibleToUser)在Fragment创建之初会回调一次isVisibleToUser的值为false,在Fragment创建之后用户可见时再回调一次,此时isVisibleToUser的值为true。
根据setUserVisibleHint(boolean isVisibleToUser)这个回调方法的特性,我们可以实现Fragment的懒加载。
1.在BaseFragment中添加变量
private boolean isViewCreated; // 界面是否已创建完成
private boolean isVisibleToUser; // 是否对用户可见
private boolean isDataLoaded = false; // 数据是否已请求
2.重载setUserVisibleHint(boolean isVisibleToUser)回调方法,创建lazyLoad()方法,在Fragment创建之后、用户可见、第一次加载时调用lazyLoadDate()方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
lazyLoad();
}
private void lazyLoad(){
if(isViewCreated && isVisibleToUser && !isDataLoaded){
isDataLoaded = true;
lazyLoadDate();
}
}
/**
* 懒加载
* 在此加载网络数据
*/
public void lazyLoadDate(){
}
3.重载onActivityCreated
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewCreated = true;
lazyLoad();
}
三、使用方法
继承BaseFragment,并且重载lazyLoadDate(),在lazyLoadDate()加载网络数据即可。