ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Fragment viewLifecycleOwner와 lifecycle의 차이
    Android📱 2023. 8. 24. 21:44

    안드로이드의 기초적인 부분에는 여러 가지가 존재한다.

    그중에서도 중요한 부분이 생명주기에 대한 부분이다.

     

    요즘은 컴포즈의 사용으로 많이 안 쓴다고 해도 여전히 프로덕트에서는 쓰이고 있는 Fragment에는 LifecycleOwner와 viewLifecycleOwner가 두 개 존재한다.

     

    fragment의 생명주기

     

    일단 viewLifecycleOwner와 LifecycleOwner의 개념을 알기위해서는 프래그먼트의 생명주기에 대한 개념이 필요하다

     

    프래그먼트는 액티비티 위에 존재하는 컴포넌트로 당연히 액티비티와는 다른 생명주기를 갖는다.

    (액티비티 보다 짧음)

    fragment lifecycle

    그리고 프래그먼트 위에 있어야하는 뷰의 생명주기는 당연히 더 짧을 것이다

     

    여기서에서부터 LifecycleOwner와 viewLifecycleOwner의 차이가 발생하게 된다.

     

    LifecycleOwner와 viewLifecycleOwner의 차이

    viewLifecycleOwner는 fragment의 생명주기와 거의 비슷하게 흘러간다.

    LifecycleOwner는 fragment의 onAttch에서 onDestroy까지를 가지고, viewLifeCycle 은 onCreateView에서 onDestoryView까지를 가지게 된다.

     

    이 작은 차이로 앱에서 메모리 누수를 일으키거나 필요 이상의 행위를 하게 될 수도 있다.

     

    특히, 화면 이동을 한다고 쳐보면 A -> B 프래그먼트로 이동을 하면 A 프래그먼트는 처음에 OnCreate가 되고, 화면을 이동할 때 onDestroy가 되지 않고 onDestroyView만 호출된다.

     

    옆에 사진을 보면 A 프래그먼트의 onCreate은 맨 처음에 한 번만 있는 것을 확인할 수 있다.

    이처럼 navigation을 사용해서 프래그먼트를 이동하게 되면 특수한 경우를 제외하고는 다음 화면이 이전 화면 위에 쌓이는 형태가 되고, 이전화면의 뷰는 사라지지만 프래그먼트는 사라지지 않는다는 것을 알 수 있다.

     

    그리고 보통 안드로이드 개발을 할 때 프래그먼트에서 뷰를 초기화하거나 flow, LiveData 등을 collect, observe 하는 함수들은 onViewCreate에서 작성을 하게 된다.

    그때 viewLifecycleOwner에 존재하는 lifecycleScope를 사용하거나 인자로 viewLifecycleOwner를 넘겨주는 동작을 볼 수 있는데

     

    이러한 동작에서 viewLifecycleOwner가 아닌 그냥 lifecycleOwner를 onViewCreate에서 작성을 하게 된다면 옵저버나 collect가 해제되지 않고 계속 생성이 될 것을 예상해 볼 수 있다.

     

    그러면 화면을 계속 이동하고 돌아오고를 반복한다면 해제되지 않은 코드들이 남아서 메모리 누수로 이어지게 된다.

     

    그렇기에 viewLifecycleOwner와 lifecycleOwner를 구분해야 하며 꼭 알아야 하는 개념이다.

     

     

    프로젝트를 진행하다가 구글에서 추천하는 lifecycle.addObserver를 사용을 해보았는데
    제대로 옵저빙이 되지 않는 것을 확인하고 viewLifecycleOwner로 변경하니 잘 되어서 나중에 찾아보자 하고 넘어갔다가 
    면접에서 질문에 이상한 답변을 해버리고....후회하며 정리를 했습니다.
    
    보완할 점이나 틀린 부분이 있다면 댓글로 알려주시면 수정해보겠습니다!!

     

     

Designed by Tistory.