안드로이드에서 DB나 서버의 값이 변경되는 값을 실시간으로 감지하고 UI에 업데이트를 하기 위해서 LiveData를 사용한다. 이를 관찰하기 위해서는 observe()매서드를 사용하게 되고, observe()에 LifecycleOwner를 전달하게 된다. 그런데, 프래그먼트에는 2개의 Lifecycle이 존재하는데, LifecycleOwner와 viewLifecycleOwner가 존재한다. 이 글을 통해서 두 개의 차이점을 알고자 한다. 우선 LifecycleOwner가 무엇인지 알아보자.
LifecyclyOwner는 프래그먼트 자체의 생명주기를 가진 클래스로, 프래그먼트의 전반적인 생명주기(onAttach() ~ onDestroy())와 연결되어 있는 Lifecycle이다.
oveeride fun onViewCreated(view: View, savedInstanceState: Bundle?){
viewModel.liveData.ovserve(this, Observer{
}
)
}
viewLifecycleOwner는 프래그면트 뷰의 생명주기(onCreateView ~ onDestroyView)를 가지고 있는 클래스이다. 프래그먼트의 UI가 활성화됬거나, 비활성화되어있을 때 연결된다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?){
viewModel.liveData.observe(viewLifecycleOwner, Observer{
}
)
}
기존의 프래그먼트는 1개의 lifecycle만 가지고 있다. 하지만 프래그먼트는 액티비티와 다르게 onDestroy가 호출되지 않은 상태에서 onCreateView가 여러번 호출될 수 있다.
예를 들어서 Todo 프래그먼트와 Bookmark 프래그먼트 2개가 있다고 가정하고, Todo 프래그먼트에서 특정 작용을 통해 Bookmark 프래그먼트로 이동했을 때, Todo 프래그먼트 속 OnDestroyView()가 호출되어 프래그먼트뷰는 소멸하지만 onDestroy()가 호출되지않아 프래그먼트는 여전히 남게된다.
이렇게되면 Bookmark 프래그먼트로 이동하였지만, Todo 프래그먼트는 그대로 남아있기 때문에 Todo프래그먼트의 LiveData는 그대로 남아있게 되고, 이는 메모리 누수를 일으킬 수 있다.
이러한 문제를 해결하기위해서 코틀린에서는 LifecycleOwner 대신 viewLifecycleOwner를 사용하게 권장하고 있다.