관리 메뉴

감성코딩

Custom Adapter 사용시 성능이슈 본문

프로그래밍/JAVA_Android

Custom Adapter 사용시 성능이슈

감성코딩 2018. 7. 12. 15:42

안녕하세요 감성코딩입니다


안드로이드 어플리케이션을 개발할 때, 우리는 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
Comments