Android Paging3

Mustafa Kurt
IBTech
Published in
3 min readOct 11, 2022

Selamlar sizlere bu yazımda Android Paging3 kütüphanesinden bahsedeceğim. Paging2 ye göre avantajlarını inceleyeleceğiz.

Paging kütüphanesi, local datasetimizden ya da ağ üzerinden gelen büyük verileri parçalar halinde görüntülememize yardımcı olur. Bu yaklaşım, uygulamanızın hem ağ bant genişliğini hem de sistem kaynaklarını daha verimli kullanmasını sağlar.Ayrıca kullanıcılara daha akıcı ve sağlıklı bir deneyim sunmuş oluruz. Twitter, facebook, instagram gibi uygulamalarda çokça kullanılmaktadır. Bu uygulamalarda ekranı aşağı kaydırdıkça veriler gösterilmektedir. Basit olarak pagination mantığı budur.

Paging3 Yenilikler

Paging3 önceki sürümlerine nazaran tamamen kotlin diliyle yazılmıştır.

List Separator (Liste ayırıcıları uygulamanın kolay bir yolunu sağlar.)

Kotlin coroutines kullanmaktadır. Coroutines Flow yapısını desteklediği gibi RxJava ve LiveData desteği de bulunmaktadır.

Verileri yenileme, yeniden deneme ve hata işleme için yerleşik destek.

Verileri cacheleminize izin verir: Kotlinde bunu CoroutineScope’ta yapabilirsiniz; Java kullanıyorsanız, LiveData ile yapılabilir.

Hata aldığınız yükleme durumunda kolayca yeniden çağırım yapmanıza yarar.

Paging3 bize PagingSource, PagingDataAdapter gibi componentler sunmaktadır

Custom Page Transforms, footer ve header iyileştirmeler yapıldı.

Paging3 Architecture

Bu bölüm, her katmanda çalışan Paging kitaplığı bileşenlerini ve disk belleği verilerini yüklemek ve görüntülemek için birlikte nasıl çalıştıklarını açıklar.

Repository layer

Paging Source -> Paging3 ile yeni gelen bir componenttir. Burası sayfalayacağımız veri kaynağını ve bu kaynaktan veriyi nasıl alacağımızdan sorumlu bir soyut sınıftır. Sadece tek bir kaynaktan veriyi sağlayacaksak bu class ı kullanabiliriz. Fakat hem remote hem de local olarak veri elde edeceksek ( remote alınan veriyi local yazıp kullancaksak) RemoteMediator kullanmamız gerekiyor.

ViewModel layer

ViewModel katmanını kullanıcı arayüzüne bağlayan bileşen PagingData’dır. Bir PagingData nesnesi, sayfalandırılmış verilerin anlık görüntüsü için bir kapsayıcıdır. Bir PagingSource nesnesini sorgular ve sonucu depolar.

Pager -> Datanın hangi kaynaktan ve nasıl çekileceğini belirtmemiz gerek. Bizden 3 parametre bekler:

  • config : Bir PagingConfig classı oluşturmayı bekler ve bu sınıf bir PagingSource’tan içeriğin nasıl yükleneceğine ilişkin bilgileri sağlar. Örneğin ne kadar ileri yükleneceği, ilk yükleme için boyut isteği..vb. Tanımlamanız gereken tek zorunlu parametre pageSize , her istekte kaç öğe yüklenmesi gerektiğini belirtmek için.
  • initalKey: PagingSource initial olduğunda atılacak ilk istek için initial key verebilirsiniz.
  • pagingSourceFactory: Yükleyeceğiniz datanın kaynağını belirtmemiz gereken parametre.

Akış başlatmak için bir örnek:

val flow = Pager(
// Configure how data is loaded by passing additional properties to
// PagingConfig, such as prefetchDistance.
PagingConfig(pageSize = 20)
) {
ExamplePagingSource(backend, query)
}.flow
.cachedIn(viewModelScope)

cachedIn ile de viewmodelscope unda datayı cacheliyoruz. Herhangi bir configuration değişikliğinde datayı sıfırdan almak yerine var olanı sağlayacak. Ayrıca memory leaki de önlemiş olacak.

Ui layer

UI katmanındaki birincil Sayfalama kitaplığı bileşeni, sayfalandırılmış verileri işleyen bir RecyclerView bağdaştırıcısı olan PagingDataAdapter’dır.

Alternatif olarak, kendi özel bağdaştırıcınızı oluşturmak için dahil edilen AsyncPagingDataDiffer bileşenini kullanabilirsiniz.

PagingDataAdapter -> 2 parametre alır, birincisi model classı ikinci ise ViewHolder’dır.

Notlar

KAYNAKLAR

https://developer.android.com/topic/libraries/architecture/paging/v3-overview

https://medium.com/androiddevelopers/introduction-to-paging-3-0-in-the-mad-skills-series-648f77231121

--

--