ViewPager2内存泄漏解决方案

2,827 阅读1分钟

泄漏原因

ViewPage2使用的RecyclerView实现,如果有多个fragment,在频繁切换的时候,会触发RecyclerView的item回收操作,但是通常我们创建Adapter的时候都会使用一个列表将创建的Fragment存储起来,fragment已经销毁了,但是仍然存在于列表中,这样就造成了内存泄漏。

class ViewPager2Adapter : FragmentStateAdapterExt(childFragmentManager, lifecycle) {
    private val fragments = SparseArray<Fragment>(5)

    private fun getFragment(position: Int):Fragment{
        // create fragment...
    }

    override fun createFragment(position: Int): Fragment {
        return getFragment(position).also { fragments.put(position, it)  }
    }

    override fun getItemCount(): Int {
        return 5
    }
}

解决方案

设置ViewPage2的itemCacheSize为itemCount,这样就避免了item的回收

class ViewPager2Adapter : FragmentStateAdapterExt(childFragmentManager, lifecycle) {
    private val fragments = SparseArray<Fragment>(5)
 
    override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
        super.onAttachedToRecyclerView(recyclerView)
        // 设置recyclerView itemCacheSize
        recyclerView.setItemViewCacheSize(itemCount)
    }
    
    private fun getFragment(position: Int):Fragment{
        // create fragment...
    }

    override fun createFragment(position: Int): Fragment {
        return getFragment(position).also { fragments.put(position, it)  }
    }

    override fun getItemCount(): Int {
        return 5
    }
}