商务网站建设实验记录,泉州网站制作维护,远程服务器怎么建设自己的网站,赣州网站建设多少钱ViewPager配合不同的PagerAdapter#xff0c;对应Fragment的生命周期有着不同的表现#xff0c;了解这个生命周期机制对于开发者选择合适的PagerAdapter实现不同的效果#xff0c;有着很大的帮助。 FragmentPagerAdapter和FragmentStatePagerAdapter的区别#xff1a;
Fra… ViewPager配合不同的PagerAdapter对应Fragment的生命周期有着不同的表现了解这个生命周期机制对于开发者选择合适的PagerAdapter实现不同的效果有着很大的帮助。 FragmentPagerAdapter和FragmentStatePagerAdapter的区别
FragmentPagerAdapter 类内的每一个生成的 Fragment 都将保存在内存之中因此适用于那些相对静态的页数量也比较少的那种如果需要处理有很多页并且数据动态性较大、占用内存较多的情况应该使用FragmentStatePagerAdapter。FragmentStatePagerAdapter 正如其类名中的 ‘State’ 所表明的含义一样该 PagerAdapter 的实现将只保留当前页面当页面离开视线后就会被消除释放其资源 而在页面需要显示时生成新的页面(就像 ListView的实现一样)。这么实现的好处就是当拥有大量的页面时不必在内存中占用大量的内存。
viewPager.setOffscreenPageLimit(X)对Fragment创建时机的影响
如果ViewPager下有N个fragments并设置了setOffscreenPageLimit(X)则当fragment1用户可见时其后面X个fragment也已经同fragment1一同预先创建完成。当滑动fragment1-fragment2时第X2个fragment完成创建以保持当前fragmentfragment2后有X个fragment已经创建完成作为缓存。
FragmentPagerAdapter和FragmentStatePagerAdapter差别
如前面提到FragmentPagerAdapter不会释放创建过的fragment这样当fragment1-fragmentN完成以轮切换后从fragmentN-fragment1反方向切换时不会再触发fragment的创建即onCreate()不会被调用。 而FragmentStatePagerAdapter做从fragmentN-fragment1反方向切换时则会继续触发fragment的创建以保障有X个fragment被创建并缓存着因为大于X的fragment已经被释放了 总结fragment的onCreate()总是预先被调用且被调用的时机总是同当前用户可见的fragment保持X个fragment的“距离“即某个fragment的onCreate()被调用时它的前X个fragment是用户可见的。 奇怪的onResume()前面说明了onCreate()被触发的规律但是onResume()的触发规律则十分奇怪eg有以下fragmentf1f2f3f4当f1-f2时f2的onResume()被触发当f2-f3时f3的onResume()被触发当f3-f2时f2的onResume()不会被触发当f2-f3时f3的onResume()仍然被触发鉴于这个onResume()被触发的规律很“混乱”所以不宜做一些需要确定性的任务。后面有机会在研究下了
实际应用 当fragment切换至用户可见后要做一些处理比如请求网络数据更新当前页面等。 经过前面的分析可知onCreate()和onResume()的触发时机都不满足以上要求onCreate()会预创建FragmentPagerAdapter下还会一直缓存onResume()的触发时机又没有规律正常情况下大家对于这种需求一般会想到resume()这类接口。
我们可以利用setUserVisibleHint()接口实现该功能即当本fragment为用户可见时该接口被触发以达到每次fragment切换为可见后更新当前fragment页面数据的目的。 实现类似网易新闻客户端ViewPager每次只加载当前页。 如前所诉使用FragmentPagerAdapter或者FragmentStatePagerAdapter都会默认多加载X页X通过setOffscreenPageLimit()设置最小值为1。 这个需求同样通过setUserVisibleHint()来实现将网络请求加载页面的处理从onCreate()中移到setUserVisibleHint()中这样就实现了切换到页面才进行更新的效果。 notes貌似在某些厂商的rom上对FragmentPagerAdapter的缓存机制做了改动导致缓存失效这样就要十分小心对缓存fragment生命周期的处理尽量避免引用不在前台展示的fragment。