Multithreading & primer callback

Kursus Mengembangkan Aplikasi Android di Kotlin mengasumsikan bahwa Anda sudah memahami konsep dan terminologi multithreading. Halaman ini adalah pengantar dan penyegaran tingkat tinggi.

Perangkat seluler memiliki prosesor, dan sekarang, sebagian besar perangkat memiliki beberapa prosesor hardware yang masing-masingnya menjalankan proses secara bersamaan. Hal ini disebut multipemrosesan.

Untuk menggunakan prosesor dengan lebih efisien, sistem operasi dapat mengaktifkan aplikasi untuk membuat lebih dari satu thread eksekusi di dalam proses. Ini disebut multithreading.

image

Anda dapat menganggapnya sebagai membaca beberapa buku sekaligus, beralih antar buku setelah setiap bab, yang pada akhirnya menyelesaikan semua buku, tetapi Anda tidak dapat membaca lebih dari satu buku pada waktu yang sama.

Cara ini memerlukan infrastruktur untuk mengelola semua thread tersebut.

image

Penjadwal bertanggung jawab atas hal-hal seperti prioritas, dan memastikan semua thread dijalankan dan diselesaikan. Tidak ada buku yang dapat selamanya berada di rak dan menjadi berdebu, tapi jika sangat panjang, atau dapat menunggu, mungkin perlu beberapa saat sebelum buku tersebut dikirimkan.

Petugas operator menyiapkan thread yang mengirimkan Anda buku yang perlu dibaca, dan menentukan konteks agar hal tersebut terjadi. Anda dapat menganggap konteks tersebut sebagai ruang membaca khusus yang terpisah. Beberapa konteks sebaiknya digunakan untuk operasi antarmuka pengguna, dan yang lainnya dikhususkan untuk menangani operasi input/output.

Satu-satunya hal yang perlu diketahui adalah bahwa aplikasi yang dijalankan pengguna biasanya memiliki thread utama yang berjalan di latar depan dan dapat mengirim thread lainnya yang mungkin berjalan di latar belakang.

Di Android, thread utama adalah satu thread yang menangani semua update pada UI. Thread utama ini, yang juga disebut UI thread, juga merupakan thread yang memanggil semua pengendali klik dan callback UI serta siklus proses lainnya. UI thread adalah thread default. Kecuali aplikasi Anda secara eksplisit mengganti thread atau menggunakan class yang berjalan pada thread lain, semua yang aplikasi Anda lakukan berada di thread utama.

Hal ini akan menciptakan potensi tantangan. UI thread harus berjalan lancar untuk menjamin pengalaman pengguna yang baik. Agar aplikasi Anda ditampilkan kepada pengguna tanpa jeda yang terlihat, thread utama harus memperbarui layar setiap 16 md atau lebih sering, atau sekitar 60 frame per detik. Pada kecepatan ini, manusia menganggap perubahan frame tersebut sebagai sepenuhnya lancar. Itu jumlah frame yang banyak, namun dalam waktu yang singkat. Oleh karena itu, di Android sangat penting untuk menghindari pemblokiran UI thread. Memblokir dalam konteks ini berarti UI thread tidak melakukan apa-apa saat menunggu hal seperti database agar menyelesaikan pembaruan.

image

Banyak tugas umum yang memerlukan waktu lebih dari 16 milidetik, seperti mengambil data dari internet, membaca file besar, atau menulis data ke database. Oleh karena itu, memanggil kode untuk melakukan tugas seperti tugas dari thread utama dapat menyebabkan aplikasi dijeda, tersendat, atau bahkan berhenti. Dan jika Anda memblokir thread utama terlalu lama, aplikasi bahkan dapat mengalami error dan menampilkan dialog "aplikasi tidak merespons" (ANR).

Callback

Anda memiliki beberapa opsi untuk menyelesaikan pekerjaan dari thread utama.

Satu pola untuk melakukan tugas yang berjalan lama tanpa memblokir thread utama adalah callback. Dengan menggunakan callback, Anda dapat memulai tugas yang berjalan lama pada thread latar belakang. Saat tugas selesai, callback, yang disediakan sebagai argumen, akan dipanggil untuk membentuk kode hasil pada thread utama.

Callback adalah pola yang bagus, tetapi memiliki beberapa kekurangan. Kode yang sering menggunakan callback dapat menjadi sulit dibaca dan lebih sulit untuk diprediksi. Karena meskipun kode terlihat berurutan, kode callback akan berjalan pada waktu asinkron nantinya. Selain itu, callback tidak mengizinkan penggunaan beberapa fitur bahasa, seperti pengecualian.

Coroutine

Di Kotlin, coroutine adalah solusi untuk menangani tugas yang berjalan lama dengan elegan dan efisien. Coroutine Kotlin memungkinkan Anda mengonversi kode berbasis callback menjadi kode berurutan. Kode yang ditulis secara berurutan biasanya lebih mudah dibaca, dan bahkan dapat menggunakan fitur bahasa seperti pengecualian. Pada akhirnya, coroutine dan callback melakukan hal yang sama persis: menunggu hingga hasil tersedia dari tugas yang berjalan lama dan melanjutkan eksekusi.