프래그먼트에서 LiveData
를 위해서 관찰자를 두거나, Flow
를 위해 lifecycleScope가 필요할 때 viewLifeCycleOwner
가 심심찮게 보이곤 합니다.
viewLifecycleOwner.lifecycleScope.launch {
viewModel.searchQuery.collectLatest { query ->
binding.toolbar.title = query
}
}
위 코드에서 viewLifecycleOwner를 지우고 실행시켜도 물론 잘 돌아갑니다. 그렇지만 왜 사용하는 것일까요?
이 글을 읽는 모든 분들이 잘 아시겠지만, 프래그먼트의 생명주기는 onAttach 부터 시작해서 onDestroy 에서 끝납니다.
그러나 여기에 viewLifecycleOwner
를 쓴다면 프래그 먼트 생명주기 중에서 onCreateView 부터 onDestroyView 까지의 생명주기만 쓰게 됩니다.
즉, viewLifecycleOwner의 생명주기가 더 짧습니다.
그렇기에 onCreateView 이전, onDestroyView 이후에서 viewLifecycleOwner
를 호출하게 된다면 IllegalStateException
이 뜹니다.
@MainThread
@NonNull
public LifecycleOwner getViewLifecycleOwner() {
if (mViewLifecycleOwner == null) {
throw new IllegalStateException("Can't access the Fragment View's LifecycleOwner when "
+ "getView() is null i.e., before onCreateView() or after onDestroyView()");
}
return mViewLifecycleOwner;
}
액티비티와는 다르게 프래그먼트에서는 onDestroy
호출 이전에 onCreateView
가 여러번 호출 될 수 있습니다.
만약에 LiveData
관찰을 위한 옵저버를 두어야 할때, lifecycleOwner를 this로 작성하게 된다면 앞서 말한 이유로 인해 복수의 옵져버가 할당될 수 있습니다.
그렇기에 viewLifecycleOwner
를 사용하여 메모리 누수 문제를 해결할 수 있습니다.