Android

[Android] Fragment에서 ViewBinding 메모리 누수 방지

안드선생 2022. 5. 2. 23:18
반응형

https://developer.android.com/topic/libraries/view-binding

 

뷰 결합  |  Android 개발자  |  Android Developers

뷰 결합 뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정된 뷰 결합은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성합니다. 바인딩

developer.android.com

Fragment에서 ViewBinding을 사용할 경우 메모리 누수(Memory leak)를 조심해야 합니다.

그 이유를 Fragment의 생명주기와 함께 알아봅시다.

 

먼저, Fragment의 생명주기를 보면 다음과 같습니다.

Fragment Lifecycle

위 Fragment의 생명주기를 보면 onCreate 이후에 onCreateView가 호출되는 것을 알 수 있습니다.

onCreate는 Fragment가 생성될 때 호출되며, onCreateView는 Fragment의 뷰를 구성할 때 호출됩니다.

 

즉, onCreate는 아직 화면이 보이지 않은 상태(View가 생성되지 않은 상태)에서 실행되고

onCreateView는 화면(뷰)을 구성할 때 실행됩니다.

 

그럼 반대로, Fragment을 닫을때는 View를 먼저 닫고 Fragment를 닫아야 하겠죠? ( 괄호를 먼저 열고 늦게 닫는 개념 )

그래서 onDestroyView가 호출된 후에 onDestroy가 호출됩니다.

 

따라서, Fragment는 View 보다 생명주기가 오래 지속되게 됩니다.

 

이 내용을 기억한 상태로, 다음 코드를 봅시다.

    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
    }

위 코드의 onCreateView에서 binding을 선언하여 뷰를 결합함으로써 view에 대한 reference를 참조하게 됩니다.

이 때, 만약 Fragment A에서 Fragment B로 전환이 된다면

Fragment A의 View는 사라지게 되지만 Fragment A는 아직 종료되지 않은 상태로 남게 됩니다.

그래서 Fragment는 binding변수를 계속 갖고있는 상태로 view에 대한 reference를 참조하고 있게 됩니다.

 

즉, Fragment A의 View요소들은 쓰이지 않음에도 불구하고 아직 view에 대한 reference가 남아 있기 때문에

메모리 누수가 발생하게 됩니다.

 

그래서 이를 방지하기 위해 바로 아랫 부분의 onDestroyView에서 binding변수를 null로 만들어 view에 대한 reference의 참조를 해제해 주는 겁니다.

 

위의 설명이 바로 상단의 안드로이드 공식 문서 링크에 나와있는 설명인

"프래그먼트는 뷰보다 오래 지속됩니다. 프래그먼트의 onDestroyView() 메서드에서 결합 클래스 인스턴스 참조를 정리해야 합니다." 입니다.

 

따라서, Fragment에서 ViewBinding을 사용할 때는

메모리누수를 방지하기 위해 위의같이 onDestroyView에서 binding을 null로 만들어 참조를 해제해주는 습관을 가지는 것이 좋습니다.

 

 

 

이 방법 외에도, Binding 사용시 메모리 누수를 방지하는 것에 대한 여러가지 방법이 있지만

오늘은 위와 같은 방법을 소개를 드렸습니다.

 

안드로이드 개발에 관련한 사항들은 github에도 주기적으로 업로드 하니 언제나 팔로우&맞팔은 환영입니다!

https://github.com/HongEunho/

반응형