일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- python database
- 파이썬
- python mssql
- Android
- android 성능이슈
- back button
- Android Back Button Event
- Back Button Event
- pyodbc
- pymssql
- custom adapter
- inflate
- LayoutInflater
- Java
- MSSQL
- Python
- findViewById
- Today
- Total
감성코딩
Custom Adapter 사용시 성능이슈 본문
안녕하세요 감성코딩입니다
안드로이드 어플리케이션을 개발할 때, 우리는 Custom Adapter을 활용해서 리스트를 구성해야 하는 순간들이 있는데요. ex) 카카오톡 채팅목록
저는 ArrayAdapter를 상속받아 getCount(), getView()를 오버라이딩해서 구현합니다. getCount()에서 리스트가 구성될 개수를 확인하고, 그 개수만큼 getView()가 반복적으로 호출되면서 화면을 구성하는 형태로 동작하게 되어있습니다.
이 때, getView() 메소드를 구현하면서 레이아웃을 초기화하고 뷰 정보를 획득하기 위해 LayoutInflater 클래스의 inflate() 메소드와 View 클래스의 findViewById() 메소드를 사용합니다. 필수적으로 사용해야 하는 요소들이지만 해당 메소드들은 내부적으로 꽤 많은 코드가 실행되어 성능을 떨어뜨릴 수 있습니다.
이를 해결하기 위해 getView() 메소드를 확인해 보겠습니다.
- 출처 : https://developer.android.com/
이 중 두 번째 매개변수 convertView는 해당 getView() 메소드가 반환하는 뷰 객체입니다.
이 말은 getView() 메소드가 처음 호출될 때, 해당 객체는 null이라는 의미이기도 합니다.
이를 활용해서 위에서 언급했던 성능이슈를 처리하는 방법을 알아보겠습니다.
우선 뷰 객체정보를 저장하기 위한 클래스를 하나 만들었습니다.
이 후에, convertView 객체가 null인지 확인해서 getView() 메소드가 처음 호출될 때만, inflate()가 동작하도록 했고,
DriveHolder의 객체 역시 한 번만 생성되도록 처리했습니다.
여기서 setTag(), getTag()라는 메소드가 등장을 합니다. getView() 메소드의 convertView는 내부적으로 메모리를 유지시키며, 데이터를 관리하고 있습니다. 우리는 해당 객체를 활용해서 데이터를 저장하고 꺼내올 수 있는데, 이 때 활용하는 것이 각각 setTag(), getTag() 메소드입니다.
데이터를 하나만 저장할 때는 setTag(Object), getTag()의 형태로 사용할 수 있고,
두 개 이상의 데이터를 저장할 때는 setTag(key, Object), getTag(key)의 형태로 사용할 수 있습니다.
여기까지 Custom Adapter을 사용할 때, 발생할 수 있는 성능이슈를 처리하는 방법을 간단하게 알아보았습니다.
다시 정리할 내용이 생기면 그 때 돌아오겠습니다.
'프로그래밍 > JAVA_Android' 카테고리의 다른 글
Android Back Button Event 처리 (0) | 2018.10.05 |
---|