Android

Fragment와 viewLifecycleOwner

Fragment에서 LiveData를 observe할 때, lifecycleowner로 fragment 자체를 사용하는 대신 viewLifecycleOwner 를 사용하는 것이 중요하다. Fragment의 lifecycle과 Fragment View의 lifecycle이 다르기 때문이다. Fragment View의 lifecycle은 Fragment 자체의 lifecycle보다 짧을 수 있으며, 이에 따라 LiveData observation도 Fragment View의 lifecycle을 따라야 한다.

사용자가 Fragment에서 다른 화면으로 전환(navigate)할 때, Fragment view는 destroy되지만, Fragment 자체는 destroy되지 않는다. 따라서, LiveData를 Fragment의 viewLifecycleOwner를 사용하여 observe하면, Fragment View가 destroy될 때 observe를 중지하여 메모리 누수를 방지하고, 애플리케이션이 안정적으로 운영될 수 있도록 할 수 있다.

LiveData의 setValue, postValue

LiveData Object를 업데이트하기 위한 setValue는 main Thread에서 호출해야 한다.

Worker thread에서 업데이트 해야 한다면 postValue를 호출한다.

Fragment의 onCreateView, onViewCreated

Sunflower에서 onCreateView에 Adapter 설정과 Observe를 설정하는 코드가 있었다. 평소에 onCreatedView에서는 View만 생성하고, View와 관련된 로직은 onViewCreated에서 설정해서 내가 잘못 알고 있는 것인지 찾아봤다.

https://github.com/android/sunflower/blob/views/app/src/main/java/com/google/samples/apps/sunflower/GardenFragment.kt

Fragment Lifecycle 문서에서는 별 다른 언급은 없다.

https://developer.android.com/guide/fragments/lifecycle#fragment_created_and_view_initialized

onCreateView 함수 문서에서 Layout만 생성하고, View와 관련된 로직은 onViewCreated에서 처리하라고 명시되어 있다.

It is recommended to only inflate the layout in this method and move logic that operates on the returned View to onViewCreated.

https://developer.android.com/reference/androidx/fragment/app/Fragment#onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)

onCreateView가 View를 리턴하고 있기 때문에, onCreateView에서 복잡한 로직을 수행하는 것과 onViewCreated에서 수행하는 것에 차이가 있는지 확인하기 위해 각각에 Thread.sleep(10_000)을 적용해봤지만, 화면이 늦게 나오는 것은 동일했다.

따라서, onCreateView 라는 이름에 맞게 View 생성 코드만 두는 것이 권장하는 컨벤션이라고 이해하고 넘어갔다.

onCreateView가 View를 리턴하면, FragmentManager, hosting Activity가 이것을 받아 처리하는데, FragmentManager는 activity layout의 적절한 위치에 배치하는 작업을 한다.