프래그먼트에서 뷰 바인딩 사용하기

김재현·2024년 7월 17일

프래그먼트에서 ViewBinding을 사용하는 중에 binding null 처리를 통해서 메모리 누수를 방지하는 것이 좋다는 글을 보고 이유에 대해서 알아보았다.

ViewBinding을 프래그먼트에서 사용하게 될 경우에 메모리 누수(Memory leak)과 관련하여 문제가 생길 수 있다. 이는 구글 문서에 나와있다.

(아래는 구글 문서 원본)

  • 프래그먼트에서 뷰 결합 사용

    프래그먼트와 함께 사용할 결합 클래스 인스턴스를 설정하려면 프래그먼트의 onCreateView() 메서드에서 다음 단계를 따르세요.

  1. 생성된 결합 클래스에 포함된 정적 inflate() 메서드를 호출합니다. 그러면 프래그먼트에서
    사용할 결합 클래스 인스턴스가 생성됩니다.
  1. getRoot() 메서드를 호출하거나 Kotlin 속성 문법을 사용하여 루트 뷰 참조를 가져옵니다.
  1. onCreateView() 메서드에서 루트 뷰를 반환하여 화면의 활성 뷰로 만듭니다.
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

이렇게 프래그먼트에서 binding = null 처리를 해주는 이유는 아래 참고사항에 나와있다.

프래그먼트는 뷰보다 오래 지속되므로 프래그먼트의 onDestroyView() 메서드에서 결합 클래스 인스턴스 참조를 정리해야 한다고 한다.

이러한 현상때문에 메모리를 회수하려고 하여도 프래그먼트 뷰가 살아있게 되면서 회수하지 못하여 메모리 누수 현상이 일어나게 되는 것이라고 한다.

다음에는 baseFragment를 통해 반복되는 binding 코드를 줄일 수 있는 방법을 작성해봐야겠다.

참고 :

https://developer.android.com/topic/libraries/view-binding?hl=ko
https://bignerdranch.tistory.com/65

0개의 댓글