본문 바로가기
Kotlin

[Paging] UI용 PagingData 생성

by 명훈스토리 2023. 2. 7.
SMALL

현재 ArticleRepository의 Flow<Article>>을 사용하여 ViewModel에 로드된 데이터를 노출한다. 그러면 ViewModel은 UI에 노출하기 위해 stateIn 연산자를 사용하여 항상 사용할 수 있는 데이터 상태를 유지한다.

 

Paging  라이브러리를 사용하면 ViewModel의 Flow<PagingData<Article>>을 대신 노출할 수 있다. PagingData는 로드된 데이터를 래핑하고 Paging 라이브러리가 추가 데이터를 가져올 시기를 결정하는데 도움을 주는 유형이며 동일한 페이지를 두 번 요청하지 않도록 한다.

 

PagingData를 구성하기 위해 PagingData를 앱의 다른 레이어에 전달하는데 사용할 API에 따라 Pager 클래스의 여러 빌더 메소드 중 하나를 사용한다.

1. Kotlin Flow - Pager.flow 사용

2. LiveData - Pager.liveData 사용

3. RxJava Flowable - Pager.flowable 사용

4. RxJava Observable - Pager.observable 사용

 

앱에서 이미 Flow를 사용하고 있으므로 이 방법을 계속 사용한다. 단 Flow<List<Article>> 대신 Flow<PagingData<Article>>를 사용한다.

 

사용하는 PagingData 빌더에 관계없이 다음 매개변수를 전달해야 한다.

PagingConfig : 이 클래스는 로드 대기 시간, 초기 로드의 크기 쵸엋 등 PagingSource에서 콘텐츠를 로드하는 방법에 관한 옵션을 설정한다. 정의해야 하는 유일한 필수 매개변수는 각 페이지에 로드해야 하는 항목 수를 가리키는 페이지의 크기이다. 기본적으로 Paging은 로드하는 모든 페이지를 메모리에 유지한다. 사용자가 스크로랄 때 메모리를 낭비하지 않으려면 PagingConfig에서 maxSize 매개변수를 설정해야 한다. 기본적으로 Paging은 로드되지 않은 항목을 집계할 수 있고 enablePlaceholders 구성 플래그가 true인 경우 아직 로드되지 않은 콘텐츠의 자리 표시자로 null 항목을 반환한다. 이렇게 하면 아답터에 자리 표시자 뷰를 표시할 수 있다.

PagingSource를 만드는 방법을 정의하는 함수. 여기서는 ArticlePagingSource를 만들므로 Paging 라이브러리에 이 작업을 실행하는 방법을 알려주는 함수가 필요하다.

 

참고 : PagingConfig.pageSize는 여러 화면의 항목이 포함될 만큼 충분히 커야 한다. 페이지가 너무 작으면 페이지의 콘텐츠가 전체 화면을 가리지 않기 때문에 목록이 깜박일 수 있다. 페이지 크기가 클수록 로드 효율이 좋지만 목록이 업데이트될 때 지연 시간이 늘어날 수 있다. 첫 페이지에 다른 양의 항목을 로드하려면 PagingConfig.initialLoadSize를 사용해야 한다.

기본 PagingConfig.maxSize에는 제한이 없으므로 페이지가 삭제되지 않는다. 페이지를 삭제하려면 사용자가 스크롤 방향을 변경할 때 느테워크 요청이 너무 많이 발생하지 않도록 maxSize를 충분히 큰 수로 유지되야 한다. 최솟값은 pageSize + prefetchDistance * 2이다.

 

ArticleRepository 업데이트

- articlesStream 필드를 삭제한다.

- 방금 만든 ArticlePagingSource를 반환하는 articlePagingSource()라는 메소드를 추가한다.

class ArticleRepository) {

    fun articlePagingSource() = ArticlePagingSource()
}

 

ArticleRepository 정리

Paging 라이브러리는 다양한 작업을 실행한다.

- 메모리 내 캐시를 처리한다.

- 사용자가 목록의 끝에 가까워지면 데이터를 요청한다.

즉, articlePagingSource()를 제외한 ArticleRepository의 모든 값이 삭제될 수 있다. 이제 ArticleRepository 파일이 다음과 같이 표시된다.

class ArticleRepository {
    
    fun articlePagingSource() = ArticlePagingSource()
    
}

이제 ArticleViewModel에 컴파일 오류가 발생한다.

LIST

'Kotlin' 카테고리의 다른 글

[Paging] PagingData를 사용하도록 어댑터 설정  (0) 2023.02.20
[Paging] ViewModel에서 PagingData 요청 및 캐시  (0) 2023.02.20
[Paging] Paging 사용법  (0) 2023.02.05
[Paging] Paging이란?  (0) 2023.02.03
[ViewModel] ViewModel이란?  (0) 2023.02.03

댓글