Viewpager2 Inside A Fragment Leaks After Replacing The Fragment It's In By Navigation Component Navigate
At first, i had the issue for ViewPager2 inside a tab of BottomNavigationView and data binding , data binding also leaks with ViewPager2 and should be nulled in onDestroyView, leak
Solution 1:
Removing adapter from ViewPager2 in onDestroyView
method of fragment solved the memory leak issue with FragmentStateAdapter
overridefunonDestroyView() {
val viewPager2 = dataBinding?.viewPager
viewPager2?.let {
it.adapter = null
}
super.onDestroyView()
}
Also set data binding to null in onDestroyView
of fragment, i did it in base fragment, which was causing data binding related memory leak. Or use it as mentioned here for viewBinding, it applies to data binding.
privatevar _binding: ResultProfileBinding? = null// This property is only valid between onCreateView and// onDestroyView.privateval binding get() = _binding!!
overridefunonCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
overridefunonDestroyView() {
super.onDestroyView()
_binding = null
}
Note: Fragments outlive their views. Make sure you clean up any references to the binding class instance in the fragment's onDestroyView() method.
Another thing to prevent memory leaks with ViewPager2
inside a fragment is to use viewLifeCycleOwner
's lifeCycle which is between onCreateView
and onDestroyView
instead of this
with FragmentStateAdapter as mentioned here.
FragmentManagerfm= getChildFragmentManager();
Lifecyclelifecycle= getViewLifecycleOwner().getLifecycle();
fragmentAdapter = newFragmentAdapter(fm, lifecycle);
Post a Comment for "Viewpager2 Inside A Fragment Leaks After Replacing The Fragment It's In By Navigation Component Navigate"