프래그먼트에서 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

0개의 댓글