泄漏原因
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
}
}