viewLifecycleOwner

jeunguri·2022년 9월 14일
0

android

목록 보기
8/13


DB나 서버의 값이 변경되는 것을 실시간으로 감지한 후 UI에 업데이트하기 위해 LiveData를 사용한다. LiveData를 관찰하기 위해서 observe()를 사용하고, observe()에 LifecyclerOwner라는 것을 전달한다.



그렇다면 프래그먼트에서 observe() 인자로 전달되는 LifecyclerOwner와 viewLifecyclerOwner의 차이가 무엇일까?

  • LifecyclerOwner
    LifecyclerOwner는 프래그먼트 자체의 생명주기(onAttach ~ onDestroy)를 가지고 있는 클래스로, 프래그먼트의 전반적인 생명주기와 연결되어 있다.
viewModel.liveData.observe(this) { }

  • viewLifecyclerOwner
    viewLifecyclerOwner는 프래그먼트 뷰의 생명주기(onCreateView ~ onDestroyView)를 가지고 있는 클래스로, 프래그먼트의 UI가 활성화 되어있거나 비활성화 되어 있을 때 연결된다.
viewModel.liveData.observe(viewLifecyclerOwner) { }

LifeCycle은 프래그먼트가 생성되는 create 과정부터 프래그먼트가 제거되는 destroy까지 거친다. 반면, viewLifeCycle은 뷰가 생성되는 onCreateView부터 뷰가 제거되는 onDestroyView까지만 진행된다.

예를 들어, Home 프래그먼트에서 하단바의 버튼을 클릭해 My 프래그먼트로 이동했을 때, Home 프래그먼트에서 onDestroyView()가 호출되어 프래그먼트 ‘뷰’는 소멸되지만 onDestroy()는 호출되지 않아 프래그먼트 자체는 여전히 남아있는 상태가 된다.
이렇게 되면 My 프래그먼트로 이동했다 하더라도 Home 프래그먼트에서 사용했던 LiveData는 그대로 남아있게 되고, 이는 곧 메모리 누수를 초래하게 된다.



결론
프래그먼트는 액티비티와 다르게 onDestroy가 호출되지 않은 상태에서 onCreateView가 여러번 호출될 수 있다.
또한, 인자로 this를 전달했다면 경우에 따라 프래그먼트가 Destroy 되지 않았는데 새로운 observe가 등록되어 복수의 Observer가 호출되는 현상이 발생할 수 있다.

따라서 프래그먼트 내부에서 일반적으로 UI를 업데이트 하는 경우 viewLifecyclerOwner를 사용할 것을 권장한다.






참고

0개의 댓글