안드로이드 처음 시작했을 때 이 그림을 보고는 "Activity처럼 Fragment도 생명주기가 있다는 내용이구나"하고 넘겼었다. 제대로 안 본 것이다.
다시 봐보니 Fragment와 별개로 View의 Lifecycle이 존재한다는 것을 알았다.
보통 fragment를 쓰면 onDestroy 부분에 binding 객체를 null로 하여 참조를 제거해주는 코드를 베이스로 많이 쓴다. 이걸 왜 해주는지안다면 viewLifecycle도 모를 수가 없었을 텐데.
결론부터 얘기하자면 뷰의 수명이 fragment보다 짧기 때문이다. 따라서 뷰는 죽어있는데 fragment는 살아있는 경우가 있을 수 있다. 이때 죽어있는 뷰에 대한 참조를 계속 가지고 있으면 GC가 메모리 회수를 못해서 메모리 leak이 일어난다. 또한 옵저버 등을 통해 갱신시키려고 들면 NullPointerException 또는 IllegalStateException이 발생한다.
view.findViewById<Button>(R.id.someButton).setText("New Text") // 이때 view가 null일 수 있음
liveData.observe(viewLifecycleOwner, Observer {
view.textView.text = it // 뷰가 이미 파괴된 상태일 수 있음
})
따라서 해당 뷰에 영향을 줄 수 있는 로직들은 activity가 아닌 viewLifecycle을 따라야 한다.
"view가 별개의 수명주기를 가진다면 activity에서는 어떻게 되는 걸까?, 또 뷰는 언제 죽을 수 있는 거지?"라는 의문이 들었다. 이 부분은 추후 자세히 다뤄보도록 하겠다.
참고
공식 문서
'Android > 공부' 카테고리의 다른 글
retrofit의 비동기 처리 (0) | 2024.04.29 |
---|---|
Flow (2) | 2024.03.14 |
Repository의 효용에 대한 고찰 (0) | 2023.03.16 |
[공부] Github Action CI (0) | 2023.03.04 |
[공부] MVVM, ViewModel, LiveData, DataBinding, Fragment (1) | 2023.01.21 |