记ViewPager+Fragment内存溢出问题

现在的应用首页基本都会使用Activity嵌套多个Fragment的组合。方案有多种:

  1. FragmentManager 管理多个Fragment进行显示和隐藏
  2. ViewPager+PagerAdapter+Fragment 经典使用,自带动画效果,操作方便

这里我们就采用的第二种方案,使用方式就不必多说,网上一大片。但需要注意的一点是有可能一顿操作下来就莫名报内存溢出,如果没使用内存检查工具的童鞋可能还不会轻易发现这个地方会内存溢出。

这里会提前申明fragment集合和tab标题集合用于tab绑定:
val fragments: MutableList<Fragment>
val titles: Array<String>

private fun initTab() {
    fragments.clear()
    fragments.add(Fragment())
    fragments.add(Fragment())
    fragments.add(Fragment())
    
    vp.adapter = object : FragmentStatePagerAdapter(childFragmentManager) {
       override fun getCount(): Int {
        return fragments.size
       }

       override fun getPageTitle(position: Int): CharSequence? {
        return titles[position]
       }

       override fun getItem(position: Int): Fragment {
        return fragments[position]
       }
   }
   
    tab.setViewPager(vp,titles)
}

如上设置后,恭喜你!喜提内存溢出。怎么处理呢,原来只需要设置预加载Fragment数量就可解决:

vp.offscreenPageLimit=2

或者不使用fragments集合方式,而是在getItem(position: Int)方法时直接返回需要的Fragment(),之后再次回调时会复用之前的Fragment.