Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

android RecycledViewPool 본문

android

android RecycledViewPool

개발자가되고싶어 2021. 7. 24. 01:24
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만 셋팅해 주게 되면 됩니다. 

  • LayoutManagerRecyclerView에서 분리될 때 자식을 재활용할지 여부를 설정합니다. RecyclerView.RecycledViewPool 사용하는 경우 다른 RecyclerView에서 뷰를 즉시 사용할 수 있도록 recycleChildrenOnDetach 이 플래그를 true로 설정하는 것이 좋습니다.

RecycleChildrenOnDetach

직역한 것이라 어색할 문장이 어색할 수 있으나 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