Fragment LiveData observe 상황에서의viewLifecycleOwner 사용

yeji·2022년 8월 19일
0

Fragment LiveData와 viewLifecycleOwner

Fragment에서 LiveData observe 시 넘기는 인자에 따라 발생할 수 있는 문제 상황 2가지

  1. LifecycleOwner 인자에 requireActivity()를 넘기는 상황 → Exception 발생 가능성있기에 위험하다!!

    viewModel.bookList.observe(requireActivity()) { ... }
    • fragment는 onCreateView나 onViewCreated의 생명주기를 가지는데 activity의 생명주기를 따라간다면 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;
              }
    • viewLifecycleOwner는 fragment의 생명주기가 아닌 onCreate나 constructor에서 사용하면 IllegalStateException이 발생하게 된다.
    • -> viewLifecycleOwner 를 넘겨 문제 해결!
  2. LifecycleOwner 인자에 this(=fragment)를 넘기는 상황 → 이벤트 발생 시 2번 trigger 되는 문제 발생

    viewModel.bookList.observe(this) { ... }
    • 경로 : A frag → B frag → (back button) → A frag → (observing response)

      • A fragment에서 B fragment로 replace(이때 addToBackStack설정해두어 뒤로가기 누를 시 A로 돌아가는 상태)
      • 뒤로가기 눌러서 A fragment로 돌아가면 observe의 이벤트가 2번 trigger 되는 문제
    • -> viewLifecycleOwner 를 넘겨 문제 해결!

      • fragment A의 lifecycleOwner가 아닌 viewLifecycleOwner를 넘겨주면 fragment가 replace될 때 View lifecycle이 onDestroyView에서 폐기되기에 중복으로 observe되는 가능성이 배제된다.
    • 참고 : 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()에서 해주는 것이 적절하다.)

    • 출처 : https://codedaeng.tistory.com/19

profile
🐥

0개의 댓글