当前位置:首页 > 科技  > 软件

ViewPager如何通过预加载机制提高滑动性能,以及如何屏蔽预加载策略的方法

来源: 责编: 时间:2024-06-17 08:44:37 73观看
导读ViewPager默认具有预加载机制,会预先加载当前页面前后的一定数量的页面,以便在滑动时能够迅速显示新页面。预加载的数量可以通过setOffscreenPageLimit(int limit)方法来设置,但最小值通常为1,意味着前后各预加载一个页面

ViewPager默认具有预加载机制,会预先加载当前页面前后的一定数量的页面,以便在滑动时能够迅速显示新页面。预加载的数量可以通过setOffscreenPageLimit(int limit)方法来设置,但最小值通常为1,意味着前后各预加载一个页面。Akd28资讯网——每日最新资讯28at.com

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

下面看看预加载的是什么,在预加载数量更新的时候,执行polulate()方法。Akd28资讯网——每日最新资讯28at.com

void populate(int newCurrentItem) {    ViewPager.ItemInfo oldCurInfo = null;    if (this.mCurItem != newCurrentItem) {        oldCurInfo = this.infoForPosition(this.mCurItem);        this.mCurItem = newCurrentItem;    }    if (this.mAdapter == null) {        this.sortChildDrawingOrder();    } else if (this.mPopulatePending) {        this.sortChildDrawingOrder();    } else if (this.getWindowToken() != null) {        this.mAdapter.startUpdate(this);//被弃用了        int pageLimit = this.mOffscreenPageLimit;//当前的缓存页面个数        int startPos = Math.max(0, this.mCurItem - pageLimit);//计算缓存的开始位置        int N = this.mAdapter.getCount();//adapter的子内容的数量        int endPos = Math.min(N - 1, this.mCurItem + pageLimit);//计算缓存的结束位置        if (N != this.mExpectedAdapterCount) {            String resName;            try {                resName = this.getResources().getResourceName(this.getId());            } catch (NotFoundException var17) {                resName = Integer.toHexString(this.getId());            }            throw new IllegalStateException("The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: " + this.mExpectedAdapterCount + ", found: " + N + " Pager id: " + resName + " Pager class: " + this.getClass() + " Problematic adapter: " + this.mAdapter.getClass());        } else {            int curIndex = true;            ViewPager.ItemInfo curItem = null;            //开始去找 ViewPager.ItemInfo            int curIndex;            for(curIndex = 0; curIndex < this.mItems.size(); ++curIndex) {                ViewPager.ItemInfo ii = (ViewPager.ItemInfo)this.mItems.get(curIndex);                if (ii.position >= this.mCurItem) {                    if (ii.position == this.mCurItem) {                        curItem = ii;                    }                    break;                }            }            //没找到就去创建 ViewPager.ItemInfo,并放入ArrayList<ViewPager.ItemInfo> mItems中            if (curItem == null && N > 0) {                curItem = this.addNewItem(this.mCurItem, curIndex);            }            int itemIndex;            ViewPager.ItemInfo ii;            int i;            ·····一些计算操作,省略        }                    this.mAdapter.finishUpdate(this);//完成条目的更新        int childCount = this.getChildCount();        for(itemIndex = 0; itemIndex < childCount; ++itemIndex) {            View child = this.getChildAt(itemIndex);            ViewPager.LayoutParams lp = (ViewPager.LayoutParams)child.getLayoutParams();            lp.childIndex = itemIndex;            if (!lp.isDecor && lp.widthFactor == 0.0F) {                ViewPager.ItemInfo ii = this.infoForChild(child);                if (ii != null) {                    lp.widthFactor = ii.widthFactor;                    lp.position = ii.position;                }            }        }        this.sortChildDrawingOrder();    }}

ViewPager通过计算当前页面的索引(mCurItem)和预加载页面的限制数量(mOffscreenPageLimit或pageLimit)来确定需要预加载的页面范围。通过Math.max(0, mCurItem - pageLimit)计算预加载的起始页面索引(startPos),通过Math.min(N-1, mCurItem + pageLimit)计算预加载的结束页面索引(endPos),N是页面总数。在这个范围内,ViewPager会提前加载并创建页面实例,以减少用户滑动到这些页面时的加载时间。Akd28资讯网——每日最新资讯28at.com

Akd28资讯网——每日最新资讯28at.com

当ViewPager的当前页面改变时,会根据新的当前页面索引和预加载范围来加载或销毁页面实例。如果某个页面实例不再处于预加载范围内,它将被销毁以释放内存。Akd28资讯网——每日最新资讯28at.com

ViewPager.ItemInfo addNewItem(int position, int index) {    ViewPager.ItemInfo ii = new ViewPager.ItemInfo();    ii.position = position;        ii.object = this.mAdapter.instantiateItem(this, position);    ii.widthFactor = this.mAdapter.getPageWidth(position);    if (index >= 0 && index < this.mItems.size()) {        this.mItems.add(index, ii);    } else {        this.mItems.add(ii);    }    return ii;}

调用instantiateItem来创建object,在FragmentPagerAdapter的instantiateItem这个方法中,创建的是Fragment,即缓存的就是Fragment,Fragment在创建时,会有UI操作,网络操作,在还未可见的时候初始化Fragment非常消耗性能,所以应该懒加载的方式来加载,不去缓存Fragment。Akd28资讯网——每日最新资讯28at.com

ViewPager屏蔽预加载方式:Akd28资讯网——每日最新资讯28at.com

  1. 「设置setOffscreenPageLimit(int limit)方法的limit为0」:

理论上,这是最直接的方法,实际上setOffscreenPageLimit(int limit)方法中的limit值有一个最小值限制,即使你设置为0,也会自动调整为1。因为ViewPager的设计初衷就是为了预加载相邻的页面以提高滑动性能。Akd28资讯网——每日最新资讯28at.com

  1. 「自定义ViewPager」:

「方法一」:复制ViewPager的源代码,并修改DEFAULT_OFFSCREEN_PAGES常量的值为0。Akd28资讯网——每日最新资讯28at.com

「方法二」:继承ViewPager类,重写setOffscreenPageLimit(int limit)方法,利用反射修改mOffscreenPageLimit属性的值。这种方法可能涉及到对Android系统内部实现的深入了解,并且可能随着Android版本的更新而失效。Akd28资讯网——每日最新资讯28at.com

  1. Akd28资讯网——每日最新资讯28at.com

    「调整PagerAdapter」:Akd28资讯网——每日最新资讯28at.com

    Akd28资讯网——每日最新资讯28at.com

可以通过调整PagerAdapter中的instantiateItem和destroyItem方法来控制页面的加载和销毁。例如,可以在这些方法中实现更精细的页面管理策略,以减少不必要的资源消耗。Akd28资讯网——每日最新资讯28at.com

  1. Akd28资讯网——每日最新资讯28at.com

    「懒加载技术」:Akd28资讯网——每日最新资讯28at.com

    Akd28资讯网——每日最新资讯28at.com

在Fragment或页面内容中使用懒加载技术。页面只有在真正需要显示时才会被加载。这可以通过在Fragment的setUserVisibleHint(boolean isVisibleToUser)方法中判断页面是否可见来实现。Akd28资讯网——每日最新资讯28at.com

  1. Akd28资讯网——每日最新资讯28at.com

    「注意事项」:Akd28资讯网——每日最新资讯28at.com

    Akd28资讯网——每日最新资讯28at.com

屏蔽预加载可能会影响ViewPager的滑动性能,当用户滑动到新的页面时,该页面可能需要花费更长的时间来加载。Akd28资讯网——每日最新资讯28at.com

在决定屏蔽预加载之前,权衡好性能和资源消耗之间的平衡。Akd28资讯网——每日最新资讯28at.com

Akd28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-94136-0.htmlViewPager如何通过预加载机制提高滑动性能,以及如何屏蔽预加载策略的方法

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 发给马斯克 560 亿美元,特斯拉为什么还涨了

下一篇: 15个超好看的登录页面(附源码)

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 使用AIGC工具提升安全工作效率

    使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • Android 14发布:首批适配机型公布

    Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top
Baidu
map