DB나 서버의 값이 변경되는 것을 실시간으로 감지한 후 UI에 업데이트하기 위해 LiveData를 사용한다. LiveData를 관찰하기 위해서 observe()를 사용하고, observe()에 LifecyclerOwner라는 것을 전달한다.
그렇다면 프래그먼트에서 observe() 인자로 전달되는 LifecyclerOwner와 viewLifecyclerOwner의 차이가 무엇일까?
viewModel.liveData.observe(this) { }
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를 사용할 것을 권장한다.
참고