ViewPager+Fragment 懒加载学习笔记(一)

需求

想要 Fragment 显示时候再去加载数据,现在存在问题是:选中当前 Fragment 时候,它两旁的 Fragment 也会同时加载数据。如果页面数据量比较大或者加载较多大图时候(例如:加载相册集),会导致卡顿。

分析问题

1、为什么 ViewPager 会有预加载机制?
  1. 个人猜测是为了使 ViewPager 来回切换流畅;
  2. 网上查到资料都是 如何防止或者禁止 ViewPager 的预加载,其中关键方法
private static final int DEFAULT_OFFSCREEN_PAGES = 1;
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
public void setOffscreenPageLimit(int limit));
2、分析 setOffscreenPageLimit 这个方法

ViewPager 可以通过设置 setOffscreenPageLimit(1); // 表示预告加载的页面数量是 1,假设当前有四个Fragment的tab,显示一个,预先加载下一个.这样你在移动前就已经加载了下一个界面,移动时就可以看到已经加载的界面了;

为了解决禁止预加载问题,如果通过这个方法会不会生效?
答案是:无效。

为什么?

通过分析源码,会看到 limit 这个参数,如果小于 DEFAULT_OFFSCREEN_PAGES (DEFAULT_OFFSCREEN_PAGES = 1)这个默认值, limit 会被赋值 默认值 DEFAULT_OFFSCREEN_PAGES。所以我们为了取消预加载机制,通过设置 setOffscreenPageLimit(0)是没有用的。

源码:

private static final int DEFAULT_OFFSCREEN_PAGES = 1;
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;

public void setOffscreenPageLimit(int limit) {
    if (limit < DEFAULT_OFFSCREEN_PAGES) {
        Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "
                + DEFAULT_OFFSCREEN_PAGES);
        limit = DEFAULT_OFFSCREEN_PAGES;
    }
    if (limit != mOffscreenPageLimit) {
        mOffscreenPageLimit = limit;
        populate();
    }
}

解决方案

下一篇文章进行学习总结
链接: ViewPager+Fragment 懒加载学习笔记(二)

你可能感兴趣的:(android)