Android/공부
Fragment에선 왜 viewLifecycleOwner를 써야할까
끄공
2024. 9. 8. 14:04
안드로이드 처음 시작했을 때 이 그림을 보고는 "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에서는 어떻게 되는 걸까?, 또 뷰는 언제 죽을 수 있는 거지?"라는 의문이 들었다. 이 부분은 추후 자세히 다뤄보도록 하겠다.
참고
공식 문서