0Pricing
Android Academy · Pelajaran

Mengapa Paging

Biaya memuat semuanya sekaligus.

Mengapa Paging adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 4 pelajaran total.

Memuat Semuanya Itu Mahal

Bayangkan umpan dengan 50.000 item. Jika Anda mengambil dan menyimpan semuanya sekaligus, memori akan terbuang, jaringan menjadi lambat, dan UI membeku saat respons diuraikan.

Sebagian besar pengguna hanya menggulir beberapa layar pertama. Paging berarti memuat data dalam potongan kecil (halaman) saat pengguna menggulir, bukan memuat semuanya sejak awal.

Masalah dalam Kode

Pendekatan naif memuat seluruh daftar ke dalam memori. Meskipun server mendukungnya, responsnya dapat berukuran sangat besar dan daftar yang telah diurai dapat mendominasi heap.

Pola ini tidak dapat diskalakan dan berisiko menyebabkan OutOfMemoryError pada kumpulan data berukuran besar.

// Anti-pattern: load the whole table at once
suspend fun loadAllArticles(): List<Article> {
    // Could be tens of thousands of rows / megabytes of JSON
    return api.getArticles(limit = 50_000)
}

// UI holds ALL of them in memory at once
val articles = loadAllArticles()
LazyColumn {
    items(articles) { article -> ArticleRow(article) }
}

Seperti Apa Bentuk Halaman

Halaman adalah bagian kecil dari kumpulan data, biasanya terdiri dari 20–50 item. Server mengembalikan satu halaman beserta penunjuk ke halaman berikutnya, yang dapat berupa angka, offset, atau token.

Aplikasi hanya menyimpan beberapa halaman di memori dan membuang halaman lama saat pengguna menggulir menjauh.

data class ArticlePage(
    val items: List<Article>,
    val nextKey: Int?   // null means no more pages
)

// Example REST call returning one page
suspend fun getArticlePage(page: Int, size: Int = 20): ArticlePage

Mengenal Paging 3

Paging 3 adalah pustaka Jetpack yang menangani semua bagian rumit dari pemuatan halaman untuk Anda:

  • Meminta halaman berikutnya saat pengguna mendekati akhir daftar
  • Hanya menyimpan jendela item tertentu di memori
  • Menyediakan status pemuatan dan kesalahan
  • Dukungan bawaan untuk coroutine, Flow, dan Jetpack Compose

Menambahkan Dependensi

Paging 3 disediakan sebagai artefak terpisah: runtime dan integrasi Compose. Tambahkan keduanya di build.gradle.kts modul Anda.

Artefak paging-compose menyediakan fungsi pembantu untuk LazyColumn.

// build.gradle.kts (module)
dependencies {
    val pagingVersion = "3.3.6"
    implementation("androidx.paging:paging-runtime:$pagingVersion")
    implementation("androidx.paging:paging-compose:$pagingVersion")
}

Tiga Komponen Inti

Paging 3 berpusat pada tiga jenis yang akan Anda gunakan berulang kali:

  • PagingSource - mengetahui cara memuat satu halaman dari suatu sumber
  • Pager - mengonfigurasi dan menghasilkan aliran data berhalaman
  • PagingData - wadah item yang dikeluarkan sebagai Flow

Kita akan membuat masing-masing komponen ini pada pelajaran berikutnya.

PagingData dan Flow

Repositori Anda menyediakan Flow<PagingData<T>>. Antarmuka pengguna mengumpulkannya dan menampilkan item yang sedang dimuat.

Anda tidak perlu menyusun seluruh daftar sendiri - Paging mengalirkan item ke antarmuka pengguna sesuai kebutuhan.

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import kotlinx.coroutines.flow.Flow

class ArticleRepository(private val api: ArticleApi) {
    fun articles(): Flow<PagingData<Article>> = Pager(
        config = PagingConfig(pageSize = 20)
    ) {
        ArticlePagingSource(api)
    }.flow
}

PagingConfig Mengatur Jendela

PagingConfig menyesuaikan cara Paging memuat dan menyimpan data:

  • pageSize - jumlah item dalam setiap permintaan halaman
  • prefetchDistance - jarak dari tepi daftar untuk memicu pemuatan berikutnya
  • enablePlaceholders - menampilkan slot placeholder untuk item yang belum dimuat
  • maxSize - batas jumlah item yang disimpan di memori
import androidx.paging.PagingConfig

val config = PagingConfig(
    pageSize = 20,
    prefetchDistance = 5,
    enablePlaceholders = false,
    maxSize = 100
)

Jaringan atau Basis Data - atau Keduanya

PagingSource dapat mengambil data dari API REST, basis data Room, atau sumber khusus apa pun.

Untuk pengalaman offline-first yang sesungguhnya, gabungkan keduanya dengan RemoteMediator (dibahas pada pelajaran terakhir): jaringan mengisi basis data lokal, lalu antarmuka pengguna memuat halaman dari basis data tersebut.

Pengguliran Lancar, Memori Lebih Sedikit

Dengan pemuatan halaman, pengguliran tetap lancar karena setiap permintaan berukuran kecil dan jendela dalam memori dibatasi oleh maxSize.

Indikator pemuatan dan kesalahan tersedia secara otomatis melalui LoadState, sehingga Anda dapat menampilkan pemutar di bagian bawah atau tombol coba lagi tanpa pencatatan manual.

// LoadState exposes loading/error per direction
when (val state = adapterLoadState.append) {
    is LoadState.Loading -> showBottomSpinner()
    is LoadState.Error -> showRetry(state.error)
    is LoadState.NotLoading -> hideBottomSpinner()
}

Kapan Anda Membutuhkan Paging

Gunakan Paging 3 ketika:

  • Kumpulan datanya besar atau tidak terbatas, seperti feed, hasil pencarian, dan riwayat obrolan
  • Data berasal dari API jaringan yang mengembalikan halaman atau kursor
  • Anda menginginkan antarmuka pemuatan/kesalahan otomatis serta pengelolaan memori

Untuk daftar pendek dan tetap, seperti menu pengaturan, LazyColumn biasa lebih sederhana dan sudah memadai.

Pemeriksaan Singkat

Apa manfaat utama menggunakan Paging 3 untuk daftar berukuran besar?

Ringkasan: Mengapa Paging

Anda telah mempelajari mengapa memuat semuanya sekaligus berdampak buruk pada kinerja dan memori, serta bagaimana Paging 3 mengatasinya.

  • Data dimuat dalam halaman kecil saat pengguna menggulir
  • Tiga komponen intinya adalah PagingSource, Pager, dan PagingData
  • PagingConfig menyesuaikan ukuran halaman, prapengambilan, dan jendela memori
  • Paging terintegrasi dengan coroutine, Flow, dan Compose, serta menyediakan status pemuatan/kesalahan secara otomatis

Berikutnya: membuat PagingSource dan menghubungkannya ke Pager.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengapa Paging” gratis?

Ya — teks lengkap “Mengapa Paging” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengapa Paging”?

Biaya memuat semuanya sekaligus. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Android Academy?

Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Mengapa Paging” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?

Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa Paging
  2. PagingSource dan Pager
  3. Paging dalam Daftar Compose
  4. RemoteMediator dan Caching
← Kembali ke Android Academy