我应该使用FragmentPagerAdapter而不是FragmentStatePagerAdapter吗?(为什么)

3

我一直在寻找相关内容,但我只找到了它们之间的区别,这并不是重点。

如果您在ViewPager中使用FragmentStatePagerAdapter,那么您将与FragmentPagerAdapter做的事情相同,但消耗的内存要少得多。既然如此,为什么我还要使用FragmentPagerAdapter呢?

使用FragmentPagerAdapter的优势是什么?

3个回答

6
使用FragmentPagerAdapter的优点是什么?
当你有中等数量的页面时,速度会更快,足够容易保存在内存中,但超过了ViewPager希望自己保留的页面数。使用FragmentStatePagerAdapter时,随着用户导航pager,适配器会销毁一些片段并创建新片段。这需要时间,无论是直接的Java代码还是对垃圾收集的影响。如果在某些情况下不需要这个功能,为什么要付出代价呢?

好答案!我只是不明白如果我使用 FragmentStatePagerAdapter 会对垃圾回收有什么影响,因为它不会将整个片段保留在内存中。 FragmentPagerAdapter 对 GC 的影响会更大,是吗? - Lennon Spirlandelli
1
@LennonPetrick:FragmentPagerAdapter内存的影响更大。 FragmentStatePagerAdapterGC的影响更大。假设我们有10个页面。用户感到无聊时,从第一页开始通过所有页面滑动到最后一页,然后向后滑动回到开头。 FragmentPagerAdapter 将创建并保持 10 个片段,因此增加了内存压力。 FragmentStatePagerAdapter 将在途中创建和销毁 ~14 个片段,强制额外工作以充气布局等,并向 GC 转储大量垃圾。 - CommonsWare
明白了!由于 FragmentStatePagerAdapter 会不断地销毁和创建所有的片段,每当它销毁一个片段时,该片段的所有垃圾都将直接被丢到 GC 中。 非常好的解释!!非常感谢!! - Lennon Spirlandelli

1

FragmentStatePagerAdapter: 如果您的页面包含更多的片段,最好使用FragmentStatePagerAdapter,因为它只会保存片段的状态。 FragmentPagerAdapter: 而FragmentPagerAdapter会将每个片段保留在内存中,因此它会消耗更多的内存。

例如,如果您在ViewPager中有大约3个包含较少图像/位图的片段,则最好使用FragmentPagerAdapter。

为了优化,最好定义mViewPager.setOffscreenPageLimit(2); 设置应在空闲状态下保留在视图层次结构中当前页面两侧的页面数量。


你没有回答我的问题。请注意,我说过我知道它们之间的区别。然而,我的问题是如果FragmentPagerAdapter消耗更多的内存,为什么我要使用它?因为FragmentPagerAdapterFragmentStatePagerAdapter做的事情是一样的。 - Lennon Spirlandelli

1
如果您的结构依赖于嵌套片段,并且需要在内部片段上使用childFragmentManager,那么您可能会在FragmentStatePagerAdapter中遇到堆栈问题。当我遇到这个问题时,我将FragmentStatePagerAdapter更改为FragmentPagerAdapter,然后它就可以正常工作了。

我也遇到了FragmentStatePagerAdapter的问题,因为我使用了getChildFragmentManager(),导致我的视图无法点击。只有在滚动后才能点击。 - M DEV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接