Fragment懒加载(一)

用多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方法中再进行一次请求网络的操作。
这样讲应该能明白这段代码的意思。其实做法有很多种,不一定要这样写,但是思路我觉得就是这样。

上一篇:国科大推出可编程硅基光量子计算芯片,实现292个图像的量子漫步模拟,研究登上Science


下一篇:50份架构文档荟萃(分布式事务-缓存-消息-搜索、电商、支付,多活...)