setOffscreenPageLimit()如何通过保留更多的屏幕外碎片来提高ViewPager的性能?

时间:2014-01-24 00:31:14

标签: android animation android-fragments android-viewpager

我有一个ViewPager控制五个Fragments。当我从索引1处的Fragment到索引0处的Fragment时,我想消除动画中的短暂停顿。

目前,我没有打电话给setOffscreenPageLimit(),所以我知道Fragment 0在我ViewPager 1 Fragment时被Fragment保留在内存中其空闲状态,因为屏幕外页面限制默认为1(当前setOffscreenPageLimit(4)两侧各一个)。

这里让人感到困惑。如果我在ViewPager上调用Fragments,则从1到0的动画中的暂停消失了 - 动画很流畅

因此,我得出结论,不知何故,将Fragment 2-4保留在内存中可以将动画从Fragment 1改为Fragments 0。

保留Fragment 2-4如何改进从Fragment 1到onPageScrollStateChanged(int state) 0的滑动动画?

修改

我使用@Override public void onPageScrollStateChanged(int state) { if (state == 1 && mViewPager.getCurrentItem() == 1) { Debug.startMethodTracing("ViewPagerTesting", 100000000); } if (state == 0 && mViewPager.getCurrentItem() == 0) { Debug.stopMethodTracing(); } } 运行TraceView,以确定何时开始和停止跟踪,如下所示:

ViewPager

setOffscreenPageLimit(4)的辅助功能方法似乎导致UI线程冻结。当我在ViewPager上调用{{1}}时,这些可访问性方法在跟踪中会缩短 - 花费的时间可以忽略不计。

造成延误的原因是什么?

TraceView

1 个答案:

答案 0 :(得分:9)

当您使用setOffscreenPageLimit()的默认实现时,它只加载一个位于其右侧的片段。例如。当你在索引1上时,它在内存中加载索引2但不在索引0中加载,因此向左滑动必须从头开始生成一个新片段。要测试此理论,您可能需要使用setOffscreenPageLimit(2),然后尝试滑动索引1-> 0。这绝不是最佳解决方案,但有助于消除您对该概念的疑虑。