[Android] viewLifeCycleOwner
프래그먼트에서 LiveData
를 위해서 관찰자를 두거나, Flow
를 위해 lifecycleScope가 필요할 때 viewLifeCycleOwner
가 심심찮게 보이곤 합니다.
viewLifecycleOwner.lifecycleScope.launch {
viewModel.searchQuery.collectLatest { query ->
binding.toolbar.title = query
}
}
위 코드에서 viewLifecycleOwner를 지우고 실행시켜도 물론 잘 돌아갑니다. 그렇지만 왜 사용하는 것일까요?
1. 프래그먼트의 생명 주기
이 글을 읽는 모든 분들이 잘 아시겠지만, 프래그먼트의 생명주기는 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;
}
2. 그렇다면 언제 사용해야 할까?
액티비티와는 다르게 프래그먼트에서는 onDestroy
호출 이전에 onCreateView
가 여러번 호출 될 수 있습니다.
만약에 LiveData
관찰을 위한 옵저버를 두어야 할때, lifecycleOwner를 this로 작성하게 된다면 앞서 말한 이유로 인해 복수의 옵져버가 할당될 수 있습니다.
그렇기에 viewLifecycleOwner
를 사용하여 메모리 누수 문제를 해결할 수 있습니다.
References
https://gift123.tistory.com/57
Author And Source
이 문제에 관하여([Android] viewLifeCycleOwner), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@blucky8649/Android-viewLifeCycleOwner저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)