Fragment에서 LiveData observe 시 넘기는 인자에 따라 발생할 수 있는 문제 상황 2가지
LifecycleOwner 인자에 requireActivity()를 넘기는 상황 → Exception 발생 가능성있기에 위험하다!!
viewModel.bookList.observe(requireActivity()) { ... }
@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;
}
viewLifecycleOwner
를 넘겨 문제 해결!LifecycleOwner 인자에 this(=fragment)를 넘기는 상황 → 이벤트 발생 시 2번 trigger 되는 문제 발생
viewModel.bookList.observe(this) { ... }
경로 : A frag → B frag → (back button) → A frag → (observing response)
-> viewLifecycleOwner
를 넘겨 문제 해결!
참고 : Fragment의 lifecycle과 Fragment View lifecycle
둘은 다르다!
Fragment lifecycle : Create ~ Destroy
Fragment View lifecycle : CreateView ~ DestroyView
Fragment View는 onDestroyView()에서 destroyed된다!
따라서 fragment가 replace될 때 onDestroyView에서 View lifecycle은 폐기되기 때문에 중복으로 observe하는 가능성을 배제시켜준다.
*참고) onCreateView() 반환값으로 정상적인 Fragment View 객체를 제공했을 때만 FragmentView의 Lifecycle이 생성된다. (이때 Fragment View의 lifecycle이 INITIALIZED 상태로 업데이트 된다. 따라서 View에 대한 초기값 설정, LiveData observing, Adapter 셋팅 등은 onViewCreated()에서 해주는 것이 적절하다.)