TIL - 10 # RecyclerView에서 ComposeView 퍼포먼스 ## Compose UI 1.2.0-beta02 이전 버전 Compose UI 1.2.0-beta02 버전 이전에는 “ViewCompositionStrategy” 의 값이 default로 “DisposeOnDetachedFromWindow”로 되어있었습니다. 여기서 “ViewCompositionStrategy”란 composition(UI가 그려지는 단계)를 언제 dispose를 해야 하는 시기를 정의하는 것입니다. 즉, 여러 가지 전략을 사용해서 ComposeView를 자동으로 dispose를 할 수 있습니다. “DisposeOnDetachedFromWindow” 특징은 ComposeView가 Window에서 detach될 때 composition이 dispose가 됩니다. RecyclerView를 생각하면 View를 재활용해서 렌더링하는 퍼포먼스를 올리게 되는데, “DisposeOnDetachedFromWindow” 방식으로 사용하게 되면 attached 및 detached가 반복적으로 호출이 되므로 여러 번 composed가 되고 disposed되는 현상으로 퍼포먼스가 느려지는 현상이 발생하고 맙니다. 이를 방지하기 위해서 아래와 같은 해결 방법을 권고 하고 있습니다. - adapter에서 composeView에서 “ViewCompositionStrategy”를 “DisposeOnViewTreeLifecycleDestroyed”로 세팅함으로써 “LifecycleOwner”가 disposed될 때 컴포지션이 disposed 되도록 합니다. - adapter에서 onViewRecycled() 메서드를 오버라이드 해서 “홀더.composeView.disposeComposition()”를 호출합니다. 위와 같은 방식을 사용하면 composed가 되고 disposed 되는 횟수가 현저히 줄어들게 되지만 명확한 해결 방법은 아닙니다. ## Compose UI 1.2.0-beta02 이후 버전 Compose UI 1.2.0-beta02 이후에서는 “DisposeOnDetachedFromWindowOrReleasedFromPool”라는 전력이 새로 나왔으며, default로 설정되게 됩니다. 이 전략의 경우 RecyclerView와 같은 “pooling container”인 경우 뷰가 폐기되거나(RecyclerViewPool이 가득 찬 경우) 또는 창에서 RecyclerView가 window에서 분리된 경우 dispose가 됩니다. 또한 “pooling container”가 아닌 경우에는 DisposeOnDetachedFromWindow”과 동일하게 작동합니다. 이를 사용해서 RecyclerView에서 “DisposeOnDetachedFromWindow” 전략을 사용되었을때 문제점이 해결되었습니다. 참고 : https://medium.com/androiddevelopers/jetpack-compose-interop-using-compose-in-a-recyclerview-569c7ec7a583