为什么要使用懒加载
比如TabLayout+ViewPager这种模式,普通加载会请求所有页面的数据并绘制,这样对流量,性能都造成一定的浪费。使用懒加载可以优化加载网络数据的时机,做到在需要时加载,不需要时不加载。
实现思路
由于显示fragment的时候,存在viewpager的预加载机制
,且左右相邻的fragment都会回调setUserVisibleHint
这个方法,然后我们希望在进行加载数据的时候view是已经初始化完毕的,因此加载的第一个fragment需要在onStart()方法里面调用setUserVisibleHint(true)。在setUserVisibleHint方法里面判断是否view加载完毕和是否第一次加载,如果是进行数据的获取,否则不做处理。
实现懒加载的关键方法
/**
* 在fragment的生命周期之前回调
* @param isVisibleToUser 当前fragment是否可见
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
}
/** 返回当前fragment是否可见
* @return The current value of the user-visible hint on this fragment.
* @see #setUserVisibleHint(boolean)
*/
public boolean getUserVisibleHint() {
return mUserVisibleHint;
}
具体实现:
/**
* 懒加载Fragment
*/
public abstract class BasePageFragment extends BaseFragment {
protected boolean isViewInitiated;
protected boolean isVisibleToUser;
protected boolean isDataInitiated;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
prepareFetchData();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
prepareFetchData();
}
public abstract void fetchData();
public boolean prepareFetchData() {
return prepareFetchData(false);
}
public boolean prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
fetchData();
isDataInitiated = true;
return true;
}
return false;
}
}