ViewPager+Framgnet使用的优化
来源:互联网 发布:韶关市网络问政门户 编辑:程序博客网 时间:2024/05/16 15:17
ViewPager与Fragment结合使用搭建主布局已成为当前的主流,因为这使用起来确实方便,往往一个viewpager中包含了3以上的framgnet。但是随之而来的问题出现了。
问题一:Fragment来回滑动时候,原有的framgnet被销毁
当viewpager中含有5个fragment的时候,我从fragment1滑动到fragment3的时候,再滑会framgent1的时候就会发现framgent1又重新执行了变onCreate->onCreateView方法,导致fragment1中原有的数据被销毁而重新加载数据。而从fragment1滑动fragment2再滑会fragmnent1的时候,fragment1的数据并没有重新加载。后来发现Viewpager存在预加载机制。viewpager会默认加载当前fragment的左右各一个fragment,其目的也是为了避免fragment切换时的卡顿。因此,当viewpager中存在3个以上的fragment时,可以通过设置viewPager.setOffscreenPageLimit(int limit)的参数来扩大viewpager的预加载数量,例如:当我有4个fragment的时候,滑到第四个fragment的时候,第一个和第二个fragment就会被销毁,因此,只需要将limit参数设置为3就可以实现4个fragment的预加载。
问题二:扩大viewpager的预加载数量后,app的第一次启动会很卡顿
因为扩大了viewpager的预加载数量,想当然的第一次启动的时候,如果fragment中存在很多耗时操作,内存占用会增大很多,甚至出现内存溢出或者ANR等,这是不能运行的。这里我想到的解决办法是,延迟fragment中一些耗时操作的执行。
在fragment中有一个public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); }方法,这个方法是在oncreate方法之前执行的,参数isVisibleToUser 为true代表当前fragment对于用户来说是可见的。另外fragment中还有一个方法isVisible()判断当前fragment视图是否加载好。这样我们可以通过这两个方法可以对fragment做优化了
当isVisibleToUser 与 isVisible() 及isLoadData都为true时便加载数据,因为viewpager预加载了非首页的fragment,因此对于非首页的framgnet中isVisible = true isVisibleToUser = false ,当滑动到当前framgnet中时,isVisibleToUser = true ,isVisible = true ,isLoaddata = true,则就可以进行数据的加载,执行完后 将isLoadData = false ,这就可以减少了app第一次启动时所有完成的事情。上面说到的是对于非首页fragment,对于首页fragment可能就不试用了,前面提到setUserVisibleHint()方法是在oncreate()方法之前执行的,因此,当执行setUserVisibleHint()方法的时候视图并没有加载完,isVisible = fasle,所以这种判断对于首页fragmnet就不适用了。
但是话有说回来,当打开一个app,如果一个首页的fragment数据不加载,对于user来说是很厌烦的,因此对于首页的fragment我觉得也并不需要做延迟的加载啦。
- ViewPager+Framgnet使用的优化
- Android ViewPager的FragmentPagerAdapter中Fragment不重新加载数据,并且使用的是其他缓存的Framgnet的问题
- fragment+viewpager的优化
- viewpager的优化
- ViewPager中ViewPager的使用
- 关于fragment+viewpager的优化
- Viewpager的刷新机制优化
- 208.m1-ViewPager的优化
- ViewPager 的使用
- viewpager的使用
- ViewPager的使用
- ViewPager的使用
- ViewPager的简单使用
- viewpager的简单使用
- ViewPager的使用
- ViewPager 的使用
- viewpager的使用
- viewpager的简单使用
- 为政企云安全保驾护航,安普诺正式加入CSA云安全联盟
- 32位整数转二进制字符串算法
- 向全世界无私的技术奉献者致敬
- 支付宝:批量付款到支付宝账户有密接口
- linux配置java环境变量(详细)
- ViewPager+Framgnet使用的优化
- K近邻(KNN)算法
- 牛客网 不等式数列
- 医院CRM是什么?医院CRM能做什么?
- bitset
- Intellij IDEA svn的使用
- python—命名规范
- CodeForces 731 A.Night at the Museum(水~)
- 正则表达式