Paging 2 ile Paging 3 Arasında Nasıl Seçim Yapılır ve Güvenli Bir Şekilde Geçiş Yapılır
Çoğu proje için seçim açıktır: Paging 3, modern, performanslı ve Kotlin odaklı bir standarttır; geçiş genellikle 1–2 gün sürer ve aşağıda hazır adımlarla açıklanmıştır.
Paging 2 ve Paging 3'ün Temel Farkları
- Mimari:
- Paging 2: Callback yaklaşımıyla DataSource (PageKeyed/Positional) (loadInitial, loadAfter).
- Paging 3: suspend-load ile tek bir PagingSource, Pager ve Flow. Hibrit önbellek (Room + ağ) için RemoteMediator.
- Eşzamanlılık:
- Paging 2 Java/Callback/RxJava2 odaklıdır.
- Paging 3 — yerel olarak Coroutines/Flow destekler; RxJava3, Combine'i destekler.
- Önbellek ve senkronizasyon:
- Paging 2: Room/Retrofit ile manuel entegrasyon.
- Paging 3: RemoteMediator, geçersiz kılma, senkronizasyon ve önbelleğe almayı basitleştirir.
- Durum işleme:
- Paging 2: Kısmen PagedList ve callback kanca işlevleri aracılığıyla.
- Paging 3: LoadState, LoadStateAdapter, loading/error/refresh için kullanışlı işleme.
- Performans ve kararlılık:
- Paging 3, gerçek dünyadaki senaryolarda genellikle daha hızlıdır ve daha az bellek tüketir (özellikle ağ istekleri ve büyük listelerde).
Paging 3 — Google'ın 2026'da önerdiği seçenektir: Kotlin ile daha iyi entegrasyon, basitleştirilmiş önbellek ve öngörülebilir LoadState.
2026'da Ne Seçilmeli
Şu durumlarda Paging 3'ü seçin:
- Projeniz Kotlin 1.6+ (özellikle 1.9+) üzerinde ve Coroutines/Flow kullanıyorsunuz.
- Room + ağ gerekiyor (RemoteMediator önemli ölçüde basitleştiriyor).
- Büyük listelerde ölçeklenebilirlik ve bellek tasarrufu gerekli.
Sadece şu durumlarda Paging 2'de kalın:
- Kotlin/Coroutines planı olmayan büyük, kararlı bir Java projeniz varsa.
- Geçiş için kaynak harcamak istemiyorsanız ve Paging 3 özelliklerine ihtiyacınız yoksa.
Uzun vadeli destek ve yeni özellikler (Compose, MPP) planlıyorsanız, geçişi ertelemeniz önerilmez — Paging 3 öncelikli olmaya devam ediyor.
Paging 2'den Paging 3'e Adım Adım Geçiş
Tahmini süre: orta büyüklükte bir proje için 1–2 gün. Temel adımlar:
- Bağımlılıkları güncelleyin (Mart 2026 örneği):
implementation "androidx.paging:paging-runtime-ktx:3.3.2"
implementation "androidx.paging:paging-compose:3.3.2" // Compose kullanıyorsanız
- DataSource → PagingSource'a dönüştürün:
- PageKeyedDataSource/PositionalDataSource'u PagingSource<Key, Value> sınıfından türeyen bir sınıfla değiştirin.
- suspend fun load(params: LoadParams
): LoadResult<Key, Value> uygulayın.
Örnek:
class MyPagingSource(private val repo: Repo) : PagingSource<Int, Item>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Item> {
return try {
val page = params.key ?: 1
val data = repo.fetch(page, params.loadSize)
LoadResult.Page(data.items, prevKey = data.prev, nextKey = data.next)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}
- Pager oluşturun ve Flow alın:
val flow: Flow<PagingData<Item>> = Pager(
config = PagingConfig(pageSize = 20, enablePlaceholders = false),
pagingSourceFactory = { MyPagingSource(repo) }
).flow
- Room üzerinden önbellek yapıyorsanız RemoteMediator ekleyin:
- RemoteMediator<Key, Entity> uygulayın, load() içinde ağ ve veritabanını senkronize edin, Room PagingSource ile kullanın.
- UI'yi güncelleyin:
- PagedListAdapter yerine PagingDataAdapter kullanın.
- Abonelik:
lifecycleScope.launch {
viewModel.pagingFlow
.cachedIn(viewModelScope) // zorunlu
.collectLatest { adapter.submitData(it) }
}
- Footer/header için LoadStateAdapter ekleyin, refresh/loading/error işleme yapın.
cachedIn(viewModelScope) kullanmayı unutmayın — aksi takdirde veriler doğru şekilde önbelleklenmez ve UI yeniden oluşturulduğunda gereksiz istekler oluşabilir.
- Test etme:
- Offline senaryoları, boş durumları, yeniden deneme işlemlerini kontrol edin.
- Büyük listelerde ve yapılandırma değişikliklerinde performansı test edin.
Sık Yapılan Hatalar
- cachedIn unutulması — tekrarlanan yüklemelere ve bellek sızıntılarına neden olur.
- Yanlış nextKey/prevKey mantığı — sonuçlar döngüye girebilir.
- LoadState'in göz ardı edilmesi — kullanıcılar hataları/yükleme göstergelerini görmez.
- PagingSource'un singleton olarak kullanılması — PagingSource, pagingSourceFactory içinde her seferinde yeniden oluşturulmalıdır.
SSS
- Hemen geçiş yapmam gerekir mi?
- Proje aktif olarak geliştiriliyorsa ve Kotlin/Room/Retrofit kullanıyorsa evet. Pasif bir Java projesi için ertelenebilir, ancak gelecekte geçiş planlayın.
- Paging 3'ü Java'da RecyclerView ile kullanabilir miyim?
- Evet, ancak Coroutines/Flow'un sözdizimsel kolaylığının bir kısmını kaybedersiniz; API yine de RecyclerView ile uyumludur.
- Paging 4'ü beklemeli miyim?
- Paging 4, Compose MPP özellikleri ekleyebilir, ancak Paging 3 güncel ve desteklenmektedir: bugünden itibaren faydalanmak için şimdi geçiş yapın.
Gerekirse, DataSource → PagingSource geçişiniz için özel bir örnek veya geçiş kodu incelemesi sunabilirim.