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

Mat*_*gan 9 animation android android-fragments android-viewpager

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

目前,我没有打电话setOffscreenPageLimit(),所以我知道当我处于空闲状态时,Fragment0正在内存中,因为屏幕外页面限制默认为1(当前两侧各一个).ViewPagerFragmentFragment

这是令人困惑的地方.如果我打电话setOffscreenPageLimit(4)给我ViewPager,滑动从1到0动画的暂停消失了 - 动画很流畅.

因此,我得出结论,不知何故,将Fragments2-4 保持在内存中会将动画从Fragment1改为Fragment0.

保留Fragments2-4 如何将滑动动画从Fragment1改为Fragment0?

编辑

我运行了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();
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎ViewPager可访问性方法导致UI线程冻结.当我调用setOffscreenPageLimit(4)ViewPager时,这些可访问性方法在追踪中落后 - 花费的时间可以忽略不计.

造成延误的原因是什么?

TraceView

Sha*_*kti 9

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