| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android---ViewPager -> 正文阅读 |
|
[移动开发]Android---ViewPager |
目录 一、ViewPager 缓存页面与预加载 先有缓存页面,然后再预加载。因此,缓存的目的就是为了预加载。 缓存页面1) setOffScreenPageLimit(int a): 设置缓存页面个数,例如 a = 2 就缓存4个Fragment,a = 3 就缓存 6 个Fragment(左右各3个)
注意:设置 a = 0 不起作用,因为内部会重新修改为 1,那么缓存?2 个 Fragment。 例如: 当?setOffScreenPageLimit == 1 时,T3为当前展示页面(Fragment),则左右两边的T2 / T3就为缓存页面(Fragment)。 ? ?极端情况,T1为当前展示页面,由于左边没有了,那么左边就不管,就只管右边的缓存 同理,当?setOffScreenPageLimit == 2 时,左右两边各缓存 2 个Fragment,极端情况下仍然只缓存某一边的 Fragment 预加载Fragment切换的时候,会预先加载缓存的不可见的 Fragment 设置?setOffScreenPageLimit = 1,当我们从 T1 切换到 T2 时,会预加载 T3。setOffScreenPageLimit = 2,当我们从 T4 切换到 T3 时,会预加载 T2 和?T1。 ?预加载带来的问题1、预加载越多就会越卡。 2、如果一个 Fragment 占 1M, n个就占?nM,累计后就会出现 OOM(Out Of Memory),可能就会出现页面未响应的情况。 3、如果预加载的 Fragment 有网络请求等耗时操作,不仅浪费流量,还会很卡顿。 解决(性能优化)使用懒加载,来解决预加载带来的问题。 二、ViewPager 懒加载机制懒加载是什么?防止预加载,用到才加载,可见才加载,不可见就不加载。 懒加载,其实也就是延迟加载,就是等到该页面的 UI 展示给用户时,再加载该页面的数据(从网络、数据库等),而不是依靠 ViewPager 预加载机制提前加载两三个,甚至更多页面的数据。 目的:这样可以提高所属 Activity 的初始化速度,也可以为用户节约流量。而这种懒加载的方式也已经/正在被诸多 APP 所采用。 ViewPager源码ViewPager是高级UI(有Adapter的UI都是高级控件,比如RecyclerView) 任何控件都逃离不了的原则,自定义View的基础: 1、onMeasure(): 测量(高宽等信息) 2、onLayout(): 排版 == 显示在那个位置 3、onDraw(): 画出来 ViewPager 是怎么展示出来的Vieqpager + Adapter --> 适配器模式,然后用Adapter来完成数据在界面上的展示。 ? Populatepupulate()函数在onMeasure()?和 setOffScreenPageLimit() 里调用。 populate() 中重要适配器的原理。populate 调用到 Adapter 里面(源码是这样解释的),populate 的5个函数是直接与 PagerAdapter 关联绑定的。 例如:pupulate()函数里? ?ViewPager里 startUpdate() --> PagerAdapter 里? startUpdate() --> FragmentPagerAdapter 里? startUpdate() --> (如果自己定义了Adapter 继承 FFragmentPagerAdapter) 自定义Adapter 里的?startUpdate() ? FragmentPagerAdapterinstantiateItem() 与 setPrimaryItem() 是结合起来使用的。当由 t1 切换到 T3 时,T4 不会预加载,T1 也不再加载,只加载 T3。这就是源码里面的懒加载实现。 总的执行流程:? (populate关联)Adapter 完成数据适配 --> 再执行 Fragment 的生命周期。 ? ? 三、ViewPager 与 ViewPager2 的差异1、ViewPager2内部实现是RecyclerView,所以ViewPager2的性能更高。 5、ViewPager2 页面改变的监听是?registerOnPageChangeCallback();ViewPager 页面改变的监听是 setOnPageChangeListener(); registerOnPageChangeCallb |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:14:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |