ⓒ NAVER Connect Foundation
RecyclerView 는
어떻게 재활용 하는가?
2022.10.20
작성자 : 박명범
RecyclerView 의 캐싱 전략
ⓒ NAVER Connect Foundation
CHAPTER 1.
ViewHolder 는 재활용 된다
ⓒ NAVER Connect Foundation 3
1. ViewHolder 는 재활용 된다
ViewHolder 는
재활용 된다
화면에서
사라지지자 마자
재활용되지 않는
이유는?
ⓒ NAVER Connect Foundation
CHAPTER 2.
RecyclerView 의 동작
Preview
ⓒ NAVER Connect Foundation
Recycler
레이아
웃
매니저
5
2. RecyclerView 의 동작
어댑터
RecyclerView 의 동작
뷰 요청
뷰 반환
캐시
HOW?
ⓒ NAVER Connect Foundation
2. RecyclerView 의 동작
ViewHolder 탐색 순서
ViewHolder
반환
1. view cache 탐색
2. RecycledViewPool 탐색
3. 캐시에서 찾지 못했다면 새로운 ViewHolder 생성
4. ViewHolder 에 바인딩이 필요하다면 바인딩
ⓒ NAVER Connect Foundation
CHAPTER 3.
RecyclerView 의 캐시
ⓒ NAVER Connect Foundation
Cache
8
3. RecyclerView 의 캐시
Pool
뷰홀더 재활용에 핵심적인 2가지 캐시
애니메이션 관련 혹은
직접 설정해야 하는 부분 제외
ⓒ NAVER Connect Foundation
3. RecyclerView 의 캐시
View Cache
ViewHolder
반환
- Recycler 클래스의 mCachedViews 를 지칭한다
- 주석에는 “first level cache” 라고 지칭된다
- 위치를 기반으로 탐색된다
- 재바인딩 없이 그대로 뷰홀더를 재사용 할 수 있다
- 원래 위치 그대로 재사용 된다
ⓒ NAVER Connect Foundation
3. RecyclerView 의 캐시
ViewCache
ⓒ NAVER Connect Foundation
3. RecyclerView 의 캐시
Pool
ViewHolder
반환
- RecycledViewPool 클래스에서 관리된다
- RecyclerView 는 RecycledViewPool 을 필드로 가지고 있다
- 뷰타입을 기반으로 탐색된다
- 뷰타입 마다 heap이 존재한다
- 저장 시 초기화를 하기 때문에 재바인딩이 필요하다
ⓒ NAVER Connect Foundation
3. RecyclerView 의 캐시
RecyclerView.RecycledViewPool
ⓒ NAVER Connect Foundation
CHAPTER 4.
캐시에 저장하기
ⓒ NAVER Connect Foundation
4. 캐시에 저장하기
4
3
2
1
현재 보이는 화면
5
4
3
2
1
캐시
1
6
5
4
3
2
ⓒ NAVER Connect Foundation
4. 캐시에 저장하기
1
6
5
4
3
2
1
2
7
6
5
4
3
Pool
1
6
11
10
9
8
7
2
3
4
5
Full
Continue…
ⓒ NAVER Connect Foundation
4. 캐시에 저장하기
11
10
9
8
6
7
Pool 은 ViewType
마다 존재
1
2
3
4
5
Type0
1
2
3
4
5
Type1
1
2
3
4
5
Type2
1
2
3
4
5
Type3
1
2
3
4
5
Type4
ⓒ NAVER Connect Foundation
CHAPTER 5.
캐시에서 꺼내기
뷰홀더 재활용
ⓒ NAVER Connect Foundation
5. 캐시에서 꺼내기
5
4
3
2
1
6
5
4
3
2
5
4
6
3
2
재사용
재사용
재바인딩
안 됨
ⓒ NAVER Connect Foundation
6
5 5
5. 캐시에서 꺼내기
5
4
3
2
1
재사용
4
3
2
1 1
4
3
2
6
재사용
뷰타입이 1개만 존재,
뷰 타입의 크기가 동일
미리 생성
ⓒ NAVER Connect Foundation 20
5. 캐시에서 꺼내기
이제는
설명할 수 있다
거의 동시에 찍힘
ⓒ NAVER Connect Foundation 21
5. 캐시에서 꺼내기
이제는
설명할 수 있다
재활용
ⓒ NAVER Connect Foundation 22
정리
정리
Cache 는 위치를 기반으로 저장되고,
Pool 은 뷰타입을 기반으로 저장된다
Cache 는 바인딩 없이 바로 재사용되고,
Pool은 바인딩 후에 재사용 된다
화면 밖으로 벗어난 뷰는 Cache -> Pool
순으로 저장된다
ⓒ NAVER Connect Foundation
End of Document
Thank You.
들어주셔서 감사합니다
QnA
ⓒ NAVER Connect Foundation 24
https://www.figma.com/file/Ci6GYZPsV2MdoAVTItLBda/RecyclerView-
Internal?node-id=0%3A1
미처 소개하지 못한 내부 동작 코드 플로우
ⓒ NAVER Connect Foundation
3. RecyclerView 의 동작
Tip. 캐시 사이즈 조정하기
Pool
Cache
ⓒ NAVER Connect Foundation
3. RecyclerView 의 동작
Tip. Adapter 에서
쓸만한 리스너
- onViewAttachedToWindow(holder)
- onViewDetachedToWindow(holder)
- onViewRecycled(holder)
ⓒ NAVER Connect Foundation 27
2. Tip. 클릭 이벤트 처리
Tip. 클릭 이벤트 처리 – onBindViewHolder 에서 처리
❌
ⓒ NAVER Connect Foundation 28
2. Tip. 클릭 이벤트 처리
Tip. 클릭 이벤트 처리 – ViewHolder.init 에서 처리 ⭕
같은 값

[부스트캠프 웹・모바일 7기 Tech Talk]박명범_RecyclerView는 어떻게 재활용하는가

  • 1.
    ⓒ NAVER ConnectFoundation RecyclerView 는 어떻게 재활용 하는가? 2022.10.20 작성자 : 박명범 RecyclerView 의 캐싱 전략
  • 2.
    ⓒ NAVER ConnectFoundation CHAPTER 1. ViewHolder 는 재활용 된다
  • 3.
    ⓒ NAVER ConnectFoundation 3 1. ViewHolder 는 재활용 된다 ViewHolder 는 재활용 된다 화면에서 사라지지자 마자 재활용되지 않는 이유는?
  • 4.
    ⓒ NAVER ConnectFoundation CHAPTER 2. RecyclerView 의 동작 Preview
  • 5.
    ⓒ NAVER ConnectFoundation Recycler 레이아 웃 매니저 5 2. RecyclerView 의 동작 어댑터 RecyclerView 의 동작 뷰 요청 뷰 반환 캐시 HOW?
  • 6.
    ⓒ NAVER ConnectFoundation 2. RecyclerView 의 동작 ViewHolder 탐색 순서 ViewHolder 반환 1. view cache 탐색 2. RecycledViewPool 탐색 3. 캐시에서 찾지 못했다면 새로운 ViewHolder 생성 4. ViewHolder 에 바인딩이 필요하다면 바인딩
  • 7.
    ⓒ NAVER ConnectFoundation CHAPTER 3. RecyclerView 의 캐시
  • 8.
    ⓒ NAVER ConnectFoundation Cache 8 3. RecyclerView 의 캐시 Pool 뷰홀더 재활용에 핵심적인 2가지 캐시 애니메이션 관련 혹은 직접 설정해야 하는 부분 제외
  • 9.
    ⓒ NAVER ConnectFoundation 3. RecyclerView 의 캐시 View Cache ViewHolder 반환 - Recycler 클래스의 mCachedViews 를 지칭한다 - 주석에는 “first level cache” 라고 지칭된다 - 위치를 기반으로 탐색된다 - 재바인딩 없이 그대로 뷰홀더를 재사용 할 수 있다 - 원래 위치 그대로 재사용 된다
  • 10.
    ⓒ NAVER ConnectFoundation 3. RecyclerView 의 캐시 ViewCache
  • 11.
    ⓒ NAVER ConnectFoundation 3. RecyclerView 의 캐시 Pool ViewHolder 반환 - RecycledViewPool 클래스에서 관리된다 - RecyclerView 는 RecycledViewPool 을 필드로 가지고 있다 - 뷰타입을 기반으로 탐색된다 - 뷰타입 마다 heap이 존재한다 - 저장 시 초기화를 하기 때문에 재바인딩이 필요하다
  • 12.
    ⓒ NAVER ConnectFoundation 3. RecyclerView 의 캐시 RecyclerView.RecycledViewPool
  • 13.
    ⓒ NAVER ConnectFoundation CHAPTER 4. 캐시에 저장하기
  • 14.
    ⓒ NAVER ConnectFoundation 4. 캐시에 저장하기 4 3 2 1 현재 보이는 화면 5 4 3 2 1 캐시 1 6 5 4 3 2
  • 15.
    ⓒ NAVER ConnectFoundation 4. 캐시에 저장하기 1 6 5 4 3 2 1 2 7 6 5 4 3 Pool 1 6 11 10 9 8 7 2 3 4 5 Full Continue…
  • 16.
    ⓒ NAVER ConnectFoundation 4. 캐시에 저장하기 11 10 9 8 6 7 Pool 은 ViewType 마다 존재 1 2 3 4 5 Type0 1 2 3 4 5 Type1 1 2 3 4 5 Type2 1 2 3 4 5 Type3 1 2 3 4 5 Type4
  • 17.
    ⓒ NAVER ConnectFoundation CHAPTER 5. 캐시에서 꺼내기 뷰홀더 재활용
  • 18.
    ⓒ NAVER ConnectFoundation 5. 캐시에서 꺼내기 5 4 3 2 1 6 5 4 3 2 5 4 6 3 2 재사용 재사용 재바인딩 안 됨
  • 19.
    ⓒ NAVER ConnectFoundation 6 5 5 5. 캐시에서 꺼내기 5 4 3 2 1 재사용 4 3 2 1 1 4 3 2 6 재사용 뷰타입이 1개만 존재, 뷰 타입의 크기가 동일 미리 생성
  • 20.
    ⓒ NAVER ConnectFoundation 20 5. 캐시에서 꺼내기 이제는 설명할 수 있다 거의 동시에 찍힘
  • 21.
    ⓒ NAVER ConnectFoundation 21 5. 캐시에서 꺼내기 이제는 설명할 수 있다 재활용
  • 22.
    ⓒ NAVER ConnectFoundation 22 정리 정리 Cache 는 위치를 기반으로 저장되고, Pool 은 뷰타입을 기반으로 저장된다 Cache 는 바인딩 없이 바로 재사용되고, Pool은 바인딩 후에 재사용 된다 화면 밖으로 벗어난 뷰는 Cache -> Pool 순으로 저장된다
  • 23.
    ⓒ NAVER ConnectFoundation End of Document Thank You. 들어주셔서 감사합니다 QnA
  • 24.
    ⓒ NAVER ConnectFoundation 24 https://www.figma.com/file/Ci6GYZPsV2MdoAVTItLBda/RecyclerView- Internal?node-id=0%3A1 미처 소개하지 못한 내부 동작 코드 플로우
  • 25.
    ⓒ NAVER ConnectFoundation 3. RecyclerView 의 동작 Tip. 캐시 사이즈 조정하기 Pool Cache
  • 26.
    ⓒ NAVER ConnectFoundation 3. RecyclerView 의 동작 Tip. Adapter 에서 쓸만한 리스너 - onViewAttachedToWindow(holder) - onViewDetachedToWindow(holder) - onViewRecycled(holder)
  • 27.
    ⓒ NAVER ConnectFoundation 27 2. Tip. 클릭 이벤트 처리 Tip. 클릭 이벤트 처리 – onBindViewHolder 에서 처리 ❌
  • 28.
    ⓒ NAVER ConnectFoundation 28 2. Tip. 클릭 이벤트 처리 Tip. 클릭 이벤트 처리 – ViewHolder.init 에서 처리 ⭕ 같은 값