Paging 2 ile Paging 3 Arasında Nasıl Seçim Yapılır ve Güvenli Bir Şekilde Geçiş Yapılır

Kerem Aydın·10 Temmuz 2026·⏱3 dk

Ç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:

  1. 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
  1. 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)
    }
  }
}
  1. Pager oluşturun ve Flow alın:
val flow: Flow<PagingData<Item>> = Pager(
  config = PagingConfig(pageSize = 20, enablePlaceholders = false),
  pagingSourceFactory = { MyPagingSource(repo) }
).flow
  1. 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.
  1. 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.

  1. 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.