37
개개 3 개 / 개개 개개개개개 개개개개 개개개 개개 개개 개개개개개 < 개개개개개개 > 개개개개

안드로이드 리스트뷰 최적화 사례 연구

Embed Size (px)

Citation preview

개발 3 실 / 현철

안드로이드 리스트뷰 최적화 사례 연구라인플레이 < 기술월간회의 > 기술발표

1. 리스트뷰란 ?2. 리스트뷰 사용시 자주 생기는 문제3. 문제 분석4. Case Study

1. Bad case2. Convertview3. ViewHolder4. AsyncTask5. AUIL6. 스크롤 상태에 따른 최적화

5. 성능평가6. 저장소 공유7. Q&A

Contents

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

리스트 뷰의 기본

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

1. 리스트뷰

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

2. 어댑터

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

3. 리스트뷰와 어댑터

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

리스트뷰 사용시 자주 생기는 문제

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

안드로이드 초보시절…

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

개발 완료 !6 개월간 개고생했는데 이제야 끝났구나 .QA 넘기고 좀 쉬어야지 ..

개발 완료 !

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

“ 리스트를 빠르게 움직이면 리스트뷰의 순서가 꼬여서 나옵니다 . 시간이 지나면 정상적으로 나오고요 . 그리고 스크롤 할 때 너무 버벅거려서 보기도 않좋구요 . 보통 이정도는 그냥 잘 되야 하는거 아닌가요 ? 아 이것 때문에 테스트를 진행할수 가 없네요 . 언제까지 수정 가능한가요 ? 바로되죠 ? 지금 보고를 들어가야 하는데 이것때매 보고를 못하네요 .”

QA 첫날의 피드백

자주생기는문제

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

문제 분석

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

비밀의 스크랩뷰 (ScrapView)

ListView 는 View 를 재활용한다 . 화면에 보여질 뷰를 inflate 한다음 스크롤시 재활용 하는 방식이다 .  View inflate 는 많은 비용이 드는 작업이며 , 화면에 보이지도 않은 View 를 미리그려 메모리의 문제가 생길 수 있기 때문에 한번 생성된 뷰를 재활용해서 데이터만 바꾸는 구조이다 .ListView 내부 코드를 보면 ScrapView 라는 화면에 보여질 View 배열이 존재 한다 . ListView 의 포지션에 따라 이 ScrapView 의 위치가 바뀌게되는 구조로 재활용 하게 된다 .Adapter 의 getView() 의 함수에서는 convertView 라는 이름을 사용

책에는 안나오고 기술문서에만 나옴

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

1. Inflate 가 일어날때 ViewHolder 객체에 inflate 값을 저장하고2. 해당 row 에 ViewHolder 를 setTag() 함수를 통해 저장3. 다시 해당 row 를 사용할때 getTag() 함수를 통해 사용

ViewHolder

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

AUIL(Android Universal Image Loader)

• 멀티 쓰레드 기반의 이미지 다운로더• Async 방식과 Sync 방식 둘다 지원• 쓰레드 개수 , 디코더 , 메모리 , 디스크 캐시 등을 설정할 수 있음• 이미지 캐싱을 메모리나 외장 SD 카드에 저장 할 수 있음• 다운로드 과정의 process 의 listener 를 지원함

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

스크롤 상태에 따른 최적화

1. 스크롤 진행중일 때에는 이미지를 로딩하지 않고2. 스크롤이 멈추었을 때 이미지를 로딩한다 .3. 이미지 로딩전에는 기본이미지를 사용한다 .4. 단 , 사용 방식에 따라 사용자의 호불호가 갈릴 수 있다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

bad case

con-vertview

viewholder

AUIL

scrollstate

Case Study

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

가장 나쁜 케이스

구글링으로 찾다가 적당히 복 & 붙한 코드

매번 inflate 한다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

ConvertView ConvertView 를 활용해서 inflate 비용을 줄여 리스트 뷰의 꼬임 현상과 스크롤 속도를 개선함

convertView 가 존재하면 inflate 하지 않고 재활용한다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

ViewHolder 적용

ViewHolder 패턴을 이용해서 한번 inflate 한 객체를 캐싱함

Inflate 할때 viewHolder 객체에 저장하고 viewHolder 객체를 tag 에 저장한다 .

convertView 가 존재하면 tag 에서 viewHolder 를 꺼내온다 .

viewHolder 에 포함된 뷰에 값을 업데이트 한다 .

viewHolder 객체를 정의한다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

AsyncTask 를 통해 이미지를 로딩

이미지 로딩을 AsyncTask 를 통해 수행한다 .

이미지를 로딩하는 Async-Task 를 정의한다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

AUIL 적용

AUIL 을 Initialize 한다 .

AUIL 을 통해 이미지를 로딩한다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

Scroll 이 멈추었을때만 Image FetchScroll 이 멈추었을 때만 이미지 로드 성능 많이 향상 , but 호불호가 있음

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

1. 가상의 전화번호부를 작성

1. 브라운 , 코니 , 셀리 , 문 , 제임스 연락처가 있다고 가정을 함

2. 썸네일 이미지는 웹에 있는 이미지를 fetch 해서 사용

2. 5 개의 데이터를 반복 복사해서 50,100,200 개의 리스트 데이터를

구성

예제 데이터 구성

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 측정 방법 – Step1

각 테스트 케이스를 시작할 수 있는 버튼을 배치한다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 측정 방법 – Step2

• 각 케이스의 엑티비에 진입하면• 최하단으로 자동 스크롤이 된다 .• 최하단까지 자동 스크롤이 되면 소요 시간과 단위 시간당 inflate 에 성공한 view 의 개수를 계산하여 성능을 측정한다 .• Row 의 개수를 50 개 ,100 개 ,200 개를 테스트의 범위로 한다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 테스트 결과 – 50 개

method Show count per sec Average1 2 3badcase 13.13 13.11 12.45 12.90 convertview 12.12 13.62 14.21 13.32 viewholder 12.93 13.37 13.24 13.18 AsyncTask 64.15 65.53 67.75 65.81 AUIL 68.3 67.65 66.84 67.60 scrollstate 66.93 68.68 67.11 67.57

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 테스트 결과 – 50 개

badcase convertview viewholder AsyncTask AUIL scrollstate0

10

20

30

40

50

60

70

80

show count per sec

Show count per sec Series2 Series3 Average

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 테스트 결과 – 100 개

method Show count per sec Average1 2 3badcase 0 0 0 0.00 convertview 11.16 11.28 11.16 11.20 viewholder 14.22 13.34 13.24 13.60 AsyncTask 62.65 62.65 62.9 62.73 AUIL 63.45 62.26 62.73 62.81 scrollstate 62.69 64.02 63.01 63.24

Crash 발생해서 Test 불가

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 테스트 결과 – 100 개

badcase convertview viewholder AsyncTask AUIL scrollstate0

10

20

30

40

50

60

70

show count per sec

Show count per sec Series2 Series3 Average

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 테스트 결과 – 200 개

method Show count per sec Average1 2 3badcase 0 0 0 0convertview 10.66 10.79 10.24 10.56333333viewholder 15.05 10.99 11.59 12.54333333AsyncTask 60.93 60.67 59.79 60.46333333AUIL 60.67 61.06 60.93 60.88666667scrollstate 60.95 60.49 61.12 60.85333333

Crash 발생해서 Test 불가

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

성능 테스트 결과 – 200 개

badcase convertview viewholder AsyncTask AUIL scrollstate0

10

20

30

40

50

60

70

show count per sec

Show count per sec Series2 Series3 Average

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

Demonstration

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

결론

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

1. ConvertView 를 사용하지 않으면 매번 inflate 하면서 성능이 떨어지고 리소스를 많이 사용한

다 . 데이터가 아주 많을 경우에는 Crash 가 날 수도 있다 .2. 리스트 최적화 시 가장 효과적인 것은 AsyncTask, AUIL 등으로 쓰레드를 사용해서 이미지를

별도로 로딩하는 방법이다 .3. 스크롤이 멈추었을 때만 쓰레드를 기동하는 방법은 호불호가 생길수 있다 .

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

Further Study

1. 5 개의 한정된 이미지를 rotate 해서 쓰는 경우가 의미있는 갯수의 이미지를 활용한 성능평가가

필요

2. 라인스토어의 이미지가 아닌 별도의 테스트환경을 구축해야함 ( 언제 짤릴지 모름 --;;; )3. AUIL 외의 이미지 로딩 라이브러리도 연구대상

4. 단방향 스크롤이 아닌 양방향과 랜덤한 스크롤을 발생시킨 테스트가 필요함

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

Share Information

https://github.com/Garbriel/AndroidListViewTuning

© LINE PLAY Corp. All rights reserved2016 기술월간회의 워크샵

Q & A