您的位置:首页 > 移动开发 > Android开发

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

2017-07-27 18:25 399 查看

需求

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

分析问题

1、为什么 ViewPager 会有预加载机制?

个人猜测是为了使 ViewPager 来回切换流畅;

网上查到资料都是 如何防止或者禁止 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 懒加载学习笔记(二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息