Android Paging3
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
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
- RxJava’yı kullanmak için
RxPagingSource
uygulayın. ListenableFuture
Guava'dan kullanmak içinListenableFuturePagingSource
bunun yerine uygulayın.
KAYNAKLAR
https://developer.android.com/topic/libraries/architecture/paging/v3-overview