-
[안드로이드] Fragment 바인딩 메모리 누수카테고리 없음 2024. 4. 23. 09:29
메모리 누수?
Fragment에서 바인딩을 사용 시 View보다 Lifecycle이 길어서 발생하는 문제이다.
아래처럼 코드를 짜면 Fragment가 사라질 때 제때 가비지컬렉터에 잡히지 않아서 메모리 누수가 발생하게 된다.
class ContactDetailFragment : Fragment() { private lateinit var binding: FragmentContactDetailBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentContactDetailBinding.inflate(inflater, container, false) return binding.root } }
해결법
안드로이드 공식 문서에 나온 방법이다.
(구글에선 위임을 사용하거나 아니면 라이브러리를 사용하는 방법도 있다.)
_binding을 null로 선언 후 onCreateView에서 _binding을 참조시켜주고
onDestroyView에서 _binding을 null로 만드는 방법이다.(이렇게 해야 Fragment가 종료될 때 가비지 컬렉터가 수거해간다.)
binding!!을 사용할 때 문제가 없는 이유는
보통 우리는 onViewCreated에서 View를 세팅해준다.사실상 해당 시점에는 binding을 null이 아니기 때문에 문제 없이 사용할 수 있는 것이다.
class ContactDetailFragment : Fragment() { private var _binding: FragmentContactDetailBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentContactDetailBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.profileImageView.setImageResource(R.drawable.test_image) // 문제 없음! } override fun onDestroyView() { super.onDestroyView() _binding = null } }