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

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

目前,我并没有调用setOffscreenPageLimit() ,所以我知道在Fragment 1处于空闲状态时, Fragment 0被ViewPager保留在内存中,因为屏幕外页面限制默认为1(任一当前Fragment一面)。

这是令人困惑的地方。 如果我在我的ViewPager上调用setOffscreenPageLimit(4)从1到0animation的滑动暂停就消失了 – animation是平滑的

因此,我总结道,在内存中保留Fragments 2-4将animation从Fragment 1改进为Fragment 0。

如何保留Fragments 2-4改善从Fragment 1到Fragment 0的滑动animation?

编辑

我运行TraceView,使用onPageScrollStateChanged(int state)来确定何时开始和停止跟踪,如下所示:

 @Override public void onPageScrollStateChanged(int state) { if (state == 1 && mViewPager.getCurrentItem() == 1) { Debug.startMethodTracing("ViewPagerTesting", 100000000); } if (state == 0 && mViewPager.getCurrentItem() == 0) { Debug.stopMethodTracing(); } } 

看来, ViewPager的可访问性方法正在导致UI线程冻结。 当我在ViewPager上调用setOffscreenPageLimit(4)时,这些可访问性方法在跟踪中会下降 – 完成时间可以忽略不计。

什么原因造成延误?

TraceView

Solutions Collecting From Web of "setOffscreenPageLimit()如何通过保留更多的屏幕外片段来提高ViewPager的性能?"

当你使用setOffscreenPageLimit()的默认实现时,它只加载了它右边的一个片段。 例如。 当您在索引1上时,索引2在内存中加载,但不是索引0,因此向左滑动将必须从头开始生成新的片段。 为了testing这个理论,你可能想使用setOffscreenPageLimit(2) ,然后尝试滑动索引1-> 0。 这绝不是最佳的解决scheme,但将有助于清除你对这个概念的怀疑。