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我觉得也并不需要做延迟的加载啦。


0 0
原创粉丝点击