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

来源:互联网 发布:截取串口数据代码 编辑:程序博客网 时间:2024/05/22 18:45

需求

想要 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 懒加载学习笔记(二)

原创粉丝点击