본문 바로가기

Android/AAC(Android Architecture Component)

Paging Library 정리

컨텐츠를 특정 기준으로 범위를 나누고, 스크롤을 따라 범위 단위로 로드되도록 하는 것
페이징 라이브러리는 단순히 무한 스크롤링을 지원하기 위한 구현체가 아닙니다.
안드로이드에서는 로컬 SQLite에 저장된 대량의 데이터를 RecyclerView로 표현할 때, 두 가지 선택지 중 하나를 선택할 수 있습니다. 하나는 위에서 언급한 무한 스크롤링을 이용한 방법이고, 다른 하나는 CursorAdapter 방식의 지연 로딩 기법입니다. 페이스북과 같은 피드 형태의 앱에서는 무한 스크롤링이, 연락처와 같은 앱에서는 패스트 스크롤이 가능한 지연 로딩 기법이 적합할 수 있습니다.
  • Unbounded List
    • 무한 스크롤링으로 데이터를 점진적으로 불러오는 기법에 활용 가능

  • Countable List
    • 리스트의 전체 사이즈가 필요
    • 리스트를 묶어 표현하여 패스트 스크롤 기능에 활용

 

구성 요소

DataSource

  • local 또는 Network에서 데이터를 가져오는 쿼리를 담고 있음종류

종류

  • PageKeyedDataSource
    • 인접페이지에 대한 정보가 내려올때 사용(Cusor-based 기반의 페이징)
-> GET /api/feeds.json?after=mta_xNT3&limit=20 ...
<- Status: 200 OK "data": { "after": "t3_87zdql", "before": "za_bdc23f", "feeds": [...] }
  • ItemKeyedDataSource
    • 현재리스트의 마지막요소를 이용해서 다음 페이지를 불러오는 페이지 방식에 사용(Time-based Pagination)
-> GET /api/comments.json?since=1364849754&limit=20
...
<- Status: 200 OK
"data": {
"comments": [
...
{
"id": 19,
"name": "Larry",
"comment": "It's no laughing matter.",

"timestamp: "1364859243" }
]
}
  • PositionalDataSource
    • 페이지 번호 또는 오프셋을 이용하는 페이징 방식에서 사용(Offset-based Pagination)
    • 패스트 스크롤을 지원하는 주소록과 같은 앱을 만들때 유용
-> GET /api/feeds.json?offset=50&limit=20
...
<- Status: 200 OK
"data": {
"count": 50,
"offset": 50,
"limit": 20,

"total": 890, "feeds": [...]
}

PagedList

Countable list의 경우, 리스트의 사이즈가 1000이라면 모든 항목을 한 번에 메모리에 적재하는 것이 아니라 이 중 RecyclerView에 보일 30개의 항목만 메모리에 할당하고, 나머지는 null이 될 수 있음을 의미합니다. 사용자가 스크롤을 해 null인 요소에 접근을 하면 PagedList는 해당 요소가 속한 청크를 DataSource에 요청하고, (이때 일시적으로 null을 반환했다가) 데이터 로드가 완료되면 PagedListAdpater의 onBindViewHolder 함수가 자동으로 호출되면서 뷰를 구성하는 형태입니다.
  • DataSource를 통해서 새로운 데이터에 대한 컨트롤이 가능(개발자가 직접 조작 불가)

옵션 설정

val config = PagedList.Config.Builder()
        .setInitialLoadSizeHint(20)
        .setPageSize(10)
        .setPrefetchDistance(5)
        .setEnablePlaceholders(true)
        .build()
val pagedList = PagedList.Builder(XxxDataSource(), config)

 

PagedListAdapter

PagedListAdapter는 PagedList의데이터를 RecyclerView에 표현하기 위한 어댑터 클래스입니다. 일반적인 RecyclerView 어댑터와의 차이점은 새로운 리스트가 어댑터로 전달됐을 때, DiffUtil을 이용해 이전 리스트와 비교해 변경된 요소들만을 업데이트하는 기능을 갖추고 있습니다. 두 리스트를 비교하는 처리는 백그라운드 스레드에서 실행되고, 비교가 완료되면 메인 스레드에서 notifyItem*() 함수를 호출해 UI를 업데이트합니다. 이 모든 처리는 새로운 리스트를 설정하는 PagedListAdapter.submitList(newList)를 호출했을 때 자동으로 수행됩니다.
  • DiffUtil을 통하여 리스트 내용 중복 방지
class DiffCallback : DiffUtil.ItemCallback<User>() {
        override fun areItemsTheSame(oldItem: User, newItem: User): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: User, newItem: User): Boolean {
            return oldItem == newItem
        }

    }

 

 

 

 

-참고 자료

https://medium.com/@maryangmin/android-architecture-components-%EC%86%8C%EA%B0%9C-3-52980a9e22af

 

Android Architecture Components 소개 (3) (완) - Seungmin — maryang - Medium

이전 포스팅에서는 ViewModel, Room을 살펴보았습니다. 이번 포스팅에서는 Paging과 AAC 응용을 소개하겠습니다.

medium.com

https://codelabs.developers.google.com/codelabs/android-paging/index.html?hl=ko#4

 

Android Paging codelab

The app allows you to search GitHub for repositories whose name or description contains a specific word. The list of repositories is displayed, in descending order based on the number of stars, then by the name. The database is the source of truth for data

codelabs.developers.google.com

https://medium.com/@jungil.han/paging-library-%EA%B7%B8%EA%B2%83%EC%9D%B4-%EC%93%B0%EA%B3%A0%EC%8B%B6%EB%8B%A4-bc2ab4d27b87

 

Paging Library, 그것이 쓰고싶다 - 한로니 - Medium

안드로이드 아키텍처 페이징 라이브러리는 2017년 9월 발표가 됐으며 대량의 데이터 셋을 청크 단위로 RecyclerView에 쉽게 로드할 수 있다고 소개됐습니다. 어쩌면 모바일 앱에서의 페이징은 그다지 새로울 게 없는 부분일 수도 있습니다. 무한…

medium.com

 

'Android > AAC(Android Architecture Component)' 카테고리의 다른 글

Room 정리  (0) 2019.07.01
LiveData 정리  (1) 2019.06.28