Side Project - Music Streaming App
음악 리스트를 보여주고 선택한 음악을 재생할 수 있는 음악 스트리밍 앱
공부한 내용
- ListAdapter와 DiffUtil
ListAdapter는 RecyclerView에서 리스트 데이터를 나타내기 위한 RecyclerView.Adapter 베이스 클래스이다.
ListAdapter는 백그라운드 스레드에서 리스트들 간의 차이를 계산하는 기능이 포함되어 있다.
- submitList() - 기존 리스트와 달라진 새로운 리스트를 나타낼 수 있다.
submitList로 리스트를 업데이트하기 위해서는 리스트 주소값도 달라야 한다.
따라서, 새로운 리스트가 기존 리스트와 같은 객체인 경우에는 값을 업데이트하지 못한다.
이때, 깊은 복사를 이용해서 기존 리스트의 값을 새로운 메모리 공간에 복사해서 새로운 리스트를 만들어 사용하면 새로운 리스트 내에 값이 변경된 부분을 업데이트 할 수 있다.
* 얕은 복사는 같은 주소값을 참조하기 때문에 복사한 객체의 값을 변경하면 original 객체의 값에도 영향을 미친다.
DiffUtil은 두 리스트 사이의 차이를 계산하고 첫번째 리스트를 두번째 리스트로 바꾸는 업데이트 기능을 제공하는 유틸리티 클래스이다.
DiffUtil은 RecyclerView Adapter를 업데이트하는데 사용될 수 있다.
DiffUtil.Callback을 통해 리스트에서 null이 아닌 두 아이템 간의 차이를 계산하기 위한 콜백을 사용할 수 있다.
- areItemsTheSame(T oldItem, T newItem) - 두 객체가 같은 아이템을 표현하는지를 체킹한다.
두 아이템을 구별하는 유니크한 id 값이 있다면 id 값으로 두 아이템이 같은지 아닌지를 판별할 수 있다.
- areContentsTheSame(T oldItem, T newItem) - 두 아이템이 같은 데이터를 가지고 있는지를 체킹한다.
아이템의 컨텐츠가 바뀌었는지 아닌지를 감지한다.
Object.equals(Object) 대신에 같은지를 체킹해서 이에 따라 UI를 변경할지 아닐지를 판단할 수 있다.
areContentsTheSame() 함수는 areItemsTheSame()이 true를 반환할 때에만 호출된다.
그리고 최종적으로 areContentsTheSame()에서 false가 반환된 item에 대해서만 ListAdapter의 onBindViewHolder()함수가 호출된다.
따라서, Bind 함수에서 많은 작업을 처리해야할 때 변경된 데이터가 있는 항목에서만 실행되기 때문에 성능 개선에 도움이 된다.
'Android > Side Projects' 카테고리의 다른 글
음악 스트리밍 앱 개발하기 (0) | 2022.03.10 |
---|---|
Youtube 앱 개발하기 (0) | 2022.03.05 |
Youtube 앱 개발하기 (0) | 2022.03.03 |
Youtube 앱 개발하기 (0) | 2022.03.03 |
Youtube 앱 개발하기 (0) | 2022.03.01 |