用多viewpager+fragment的朋友都知道viewpager有预加载机制,如果你每个页面都有请求网络的操作,那么只显示第一个页面就去加载完所有页面的网络数据也不好。那怎么办呢,有的朋友说那就不用viewpager,那更不行,物品就是因为Viewpager有缓存机制才用它的。于是我们换种思路,在fragment上动手脚,所以就有了懒加载这个说法。
其实懒加载的核心来自与fragment中的一个方法setUserVisibleHint,这个方法只有在从隐藏到显示和从显示到隐藏才会调用,而getUserVisibleHint()这个方法能返回显示/隐藏状态。
之前我在网上找了一些别人写的,很多都写得看着不是很好,但是我找到了一个写得挺不错的,比较符合viewpager+fragment这种情况。
public abstract class BaseLazyFragment extends BaseFragment {
/**
* 懒加载过
*/
private boolean isLazyLoaded;
private boolean isPrepared;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;
//只有Fragment onCreateView好了,
//另外这里调用一次lazyLoad()
lazyLoad();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
lazyLoad();
}
/**
* 调用懒加载
*/
private void lazyLoad() {
if (getUserVisibleHint() && isPrepared && !isLazyLoaded) {
onLazyLoad();
isLazyLoaded = true;
}
}
@UiThread
public abstract void onLazyLoad();
}
这是他写的代码,要判断是否请求网络数据有三个条件,是否第一次加载,是否是显示状态和基本组件是否已经初始化完成。
他的写法和我所想的思路一样,那我就不再花时间自己封一个,就用这个代码来讲。
首先肯定只有第一次显示才请求网络吧,之后再显示都不请求,所以要在第一次请求网络之后吧isLazyLoaded变为true。
然后对于第一个页面来说,setUserVisibleHint是在onActivityCreated方法之前,所以要在onActivityCreated方法中再进行一次请求网络的操作。
这样讲应该能明白这段代码的意思。其实做法有很多种,不一定要这样写,但是思路我觉得就是这样。