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): ArticlePageMengenal 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 halamanprefetchDistance- jarak dari tepi daftar untuk memicu pemuatan berikutnyaenablePlaceholders- menampilkan slot placeholder untuk item yang belum dimuatmaxSize- 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
PagingConfigmenyesuaikan 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.