Coroutine & Fungsi Suspend
Tulis kode asinkron yang terbaca seperti kode sinkron. Gunakan fungsi suspend, cakupan coroutine, dan dispatcher (IO, Main, Default).
Coroutine & Fungsi Suspend adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 6. 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 6 pelajaran total.
Masalah: Memblokir Thread UI
Android menjalankan semua pekerjaan UI di thread utama. Jika Anda melakukan permintaan jaringan atau pembacaan basis data di thread utama, UI akan membeku sampai pekerjaan tersebut selesai.
Jika UI membeku selama lebih dari 5 detik, Android menampilkan dialog ANR (Aplikasi Tidak Merespons) dan pengguna dapat menutup paksa aplikasi Anda.
Apa Itu Coroutine?
Kotlin Coroutines adalah cara menulis kode asinkron yang terlihat berurutan — tanpa callback dan tanpa rangkaian RxJava.
- Ringan — ribuan coroutine dapat berjalan secara bersamaan
- Dapat ditangguhkan — coroutine dapat berhenti sementara dan dilanjutkan kembali tanpa memblokir thread
- Terstruktur — coroutine mengikuti siklus hidup (cakupan)
Fungsi suspend
Fungsi yang ditandai suspend dapat menghentikan sementara eksekusinya tanpa memblokir thread. Fungsi tersebut hanya dapat dipanggil dari fungsi suspend lain atau cakupan coroutine.
import kotlinx.coroutines.*
suspend fun fetchData(): String {
delay(1000) // simulates 1 second network call
return "Data loaded!"
}
fun main() = runBlocking {
println("Fetching...")
val result = fetchData() // suspends here, doesn't block
println(result) // Data loaded!
println("Done")
}Cakupan Coroutine
Setiap coroutine berjalan di dalam cakupan yang menentukan siklus hidupnya:
viewModelScope— dibatalkan saat ViewModel dibersihkanlifecycleScope— dibatalkan saat Activity/Fragment dihancurkanGlobalScope— berjalan selamanya (hindari ini)runBlocking— hanya untuk pengujian
launch vs async
Dua cara untuk memulai coroutine:
launch { }— jalankan tanpa menunggu, tanpa nilai kembalianasync { }.await()— mengembalikan hasil yang dapat Anda tunggu
import kotlinx.coroutines.*
fun main() = runBlocking {
// launch: no return value
launch {
delay(500)
println("launch done")
}
// async: returns a Deferred<T>
val deferred = async {
delay(300)
42
}
val result = deferred.await()
println("async result: $result")
}Pengatur: Utas Mana?
Pengatur menentukan utas tempat korutin berjalan:
Dispatchers.Main— utas UI (untuk memperbarui tampilan)Dispatchers.IO— untuk operasi jaringan dan penyimpananDispatchers.Default— untuk pekerjaan yang intensif CPU
Gunakan withContext(Dispatchers.IO) { } untuk mengganti pengatur di dalam korutin.
Contoh viewModelScope
Ambil data dalam ViewModel tanpa memblokir UI:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.*
class DataViewModel : ViewModel() {
fun loadData() {
viewModelScope.launch {
// Switch to IO thread for network
val data = withContext(Dispatchers.IO) {
// simulate network request
delay(1000)
"Result from server"
}
// Back on Main thread — safe to update UI
_uiState.value = data
}
}
}Penanganan Kesalahan dalam Korutin
Tangani pengecualian di dalam korutin dengan try/catch, sama seperti pada kode biasa:
viewModelScope.launch {
try {
val result = withContext(Dispatchers.IO) {
api.fetchUser() // may throw IOException
}
_user.value = result
} catch (e: Exception) {
_error.value = "Failed: ${e.message}"
}
}Korutin Paralel
Jalankan dua tugas secara paralel dan tunggu hingga keduanya selesai menggunakan async/await:
viewModelScope.launch {
// Both run at the same time!
val userDeferred = async(Dispatchers.IO) { api.getUser() }
val postsDeferred = async(Dispatchers.IO) { api.getPosts() }
val user = userDeferred.await()
val posts = postsDeferred.await()
_state.value = UiState(user, posts)
}Pemeriksaan Singkat
Pengatur korutin mana yang harus digunakan untuk operasi jaringan dan basis data?
Ringkasan: Korutin
Sekarang Anda dapat menulis kode asinkron tanpa callback:
suspend fun— dapat berhenti sejenak tanpa memblokir utasviewModelScope.launch { }— memulai korutin dalam ViewModelwithContext(Dispatchers.IO)— beralih ke utas latar belakangasync { }.await()— pekerjaan paralel dengan hasil- try/catch bekerja seperti biasa di dalam korutin
Berikutnya: pola Repositori — pemisahan yang rapi antara sumber data.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Coroutine & Fungsi Suspend” gratis?
Ya — teks lengkap “Coroutine & Fungsi Suspend” 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 6 pelajaran total.
Apa yang akan aku pelajari di “Coroutine & Fungsi Suspend”?
Tulis kode asinkron yang terbaca seperti kode sinkron. Gunakan fungsi suspend, cakupan coroutine, dan dispatcher (IO, Main, Default). 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 3 dari 6.
Berapa lama pelajaran “Coroutine & Fungsi Suspend” 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
- ViewModel & LiveData
- Basis Data Room
- Coroutine & Fungsi Suspend
- Pola Repository
- Komponen Navigasi
- Dependency Injection dengan Hilt