개발자이야기
android RecycledViewPool 본문
RecycledViewPool
이번엔 RecycledViewPool을 이용하여 RecyclerView 를 최적화 하는 한가지의 방법에 대해 알아보겠습니다.
RecyclerView 의 핵심은 단어 그대로 뷰의 재활용 입니다.
뷰의 새로운 생성은 화면의 버벅임을 유발하는 주범이 되며 이를 최적화 할 필요가 있습니다.
우린 위와같은 ui에서 RecyclerView 가 뷰를 재사용 해 줄 것을 기대하며 사용합니다.
하지만 모든 상황에서 위와같은 ui만 있을 순 없습니다. 아래의 예시를 보겠습니다.
Google Play의 화면 입니다. 세로 RecyclerView 내에 동일한 형태의 가로 스크롤 RecyclerView 가 몇개 있는 것을 확인할 수 있습니다.
위의 가로 형태의 뷰가 완벽히 동일한 것이며 같은 type 의 ViewHolder 를 사용할 것으로 가정 해 보겠습니다.
우선 위의 ViewHolder는 서로 재사용되지 않습니다. 같은 type 의 뷰라고 한다면 너무 비효율 적입니다.
뷰의 불필요한 생성은 앱의 버벅거림을 유발할 가능성이 있습니다.
이를 해결하고자 RecycledViewPool을 사용합니다.
사용법은 간단합니다.
@Adapter
private val viewPool: RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool()
@ViewHolder
init {
recyclerview.adapter = adapter
val layoutManager = LinearLayoutManager(itemView.context)
layoutManager.recycleChildrenOnDetach = true //매우 중요
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
recyclerview.layoutManager = layoutManager
recyclerview.setRecycledViewPool(viewPool) //매우 중요
}
위의 코드에서 처럼 setRecycledViewPoll 메소드에 같은 타입의 공유할 RecyclerView 의 viewPool만 셋팅해 주게 되면 됩니다.
- LayoutManager가 RecyclerView에서 분리될 때 자식을 재활용할지 여부를 설정합니다. RecyclerView.RecycledViewPool 사용하는 경우 다른 RecyclerView에서 뷰를 즉시 사용할 수 있도록 recycleChildrenOnDetach 이 플래그를 true로 설정하는 것이 좋습니다.
직역한 것이라 어색할 문장이 어색할 수 있으나 recycleChildrenOnDetach 를 true로 설정하라는 것을 볼 수 있습니다. 실제로 테스트 결과 설정을 한 것과 안한것의 뷰 생성에 차이가 있음을 확인했습니다.
위와 같이 적용방법은 꽤나 간단합니다.
테스트 결과 RecycledViewPool 을 적용했을때 동일한 뷰의 생성 횟수를 카운트 해보았습니다.
세로 RecyclerView 내 9개의 동일한 type에 가로 RecyclerView 6개의 동일한 viewHolder를 사용 했을때의 카운트 입니다. 간단한 계산으로 9*6 개의 동일한 ViewHolder 입니다.
적용 전 44
적용 후 28
위와 같이 동일한 상태에서 뷰의 생성 횟수가 줄어든 것을 확인할 수 있었습니다.
예제 코드는 https://github.com/boidmy/RecycledViewPoolEx 에서 확인 하실 수 있습니다.
스마트폰의 성능이 갈수록 좋아지며 이렇게 까지 해야하나 싶을 수 있지만 최적화는 하면할수록 좋다고 생각하며 특히 사용자의 입장에서 단 한치의 버벅임도 원치 않을 것 입니다.
읽어주셔서 감사합니다.
'android' 카테고리의 다른 글
android Jetpack (0) | 2021.08.21 |
---|---|
android gpu 렌더링 (0) | 2021.07.26 |
android intent bundle (0) | 2021.07.22 |
android launchMode (0) | 2021.07.13 |
android 수명주기 (0) | 2021.07.08 |