Asynchronous dalam Pemrograman Android
Dalam postingan ini kita akan menelaah tentang konsep “asynchronous”. Apa maksudnya dan seperti apa penggunaannya.
Berangkat dari pengalaman saya sebagai seorang programmer nubitol dari kuliah, istilah asynchronous ini sering membuat saya kelimpungan ketika pertama kali mengenal pemrograman mobile. Apa ia sebenarnya?
Untuk mengerti asynchronous, langkah pertama adalah harus mengerti synchronous, lawan katanya
Synchronous dalam pemrograman adalah sekumpulan statement kode yang dieksekusi secara berurutan. Dengan kata lain, tiap baris statement akan dieksekusi setelah statement sebelumnya sudah selesai dieksekusi.
Mari lihat contoh kasus.
Anggap saya ingin membuat sebuah aplikasi yang akan menunggah file ke sebuah user dari back-end,
Untuk contoh ini, proses yang sebenarnya akan saya ganti dengan log :
private void upload(){
Log.d("test","Mengunggah file");
}private void showNotification(){
Log.d("test","File selesai diunggah");
}
Jika method-method tersebut saya panggil secara synchronous, maka kira-kira akan berbentuk seperti berikut:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button btnUpload = (Button) findViewById(R.id.btn_upload);
btnUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
upload();
showNotification();
}
});
}
Ketika user menekan tombol, Aplikasi akan mengeluarkan log output dengan urutan “Mengunggah file”, kemudian “File selesai diunggah”.
Tapi, bagaimana jika ternyata file yang diunggah user berukuran besar dan membutuhkan beberapa saat sampai program kita selesai mengunggah ?
Anggap file tersebut akan membutuhkan 2 detik untuk diunggah, saya ganti method upload() menjadi berikut :
private void upload(){
try { // Saya ganti log dengan 2 detik delay
Thread.sleep(2000); } catch (InterruptedException e) {
e.printStackTrace();
}
}
Ketika dijalankan, program akan berhenti selama 2 detik, sebelum menampilkan notifikasi. Kemudian logCat akan menampilkan pesan berikut:
Bagaimana jika ternyata file yang akan diunggah membutuhkan waktu 1 jam atau lebih?
Beberapa proses dalam aplikasi membutuhkan tingkat pemrosesan yang berat seperti mengunggah/mengunduh file atau mengeksekusi query database. Proses synchronous akan menjalankan semua urutan tadi dalam 1 thread prosesor, sehingga program akan seolah-olah “membeku” karena menunggu prosesor untuk selesai mengeksekusi proses yang berat tadi.
Kita tidak ingin user disodori aplikasi yang “membeku” ketika melakukan hal-hal tersebut. Kita ingin agar user tetap dapat berinteraksi dengan hal-hal penting lain di aplikasi kita.
Asynchronous, sebaliknya, mengijinkan kita untuk menjalankan statement kode di thread lain di luar thread utama. Sehingga, ketika program mengeksekusi hal-hal berat di thread lain, user tetap dapat menjalankan proses lain di thread utama.
Di dalam pemrograman Android, kita dapat menggunakan AsyncTask untuk menjalankan proses secara asynchronous.
Jika saya ubah kode program saya tadi dengan AsyncTask, maka akan menjadi seperti berikut:
private class UploadFileTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
// doInBackground() adalah tempat kita melakukan proses di thread lain
upload();
return null;
}
@Override
protected void onPostExecute(String result) {
// onPostExecute akan dieksekusi setelah doInBackground selesai dieksekusi
showNotification();
}
}@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().setTitle("API Request Demo");
Button btnUpload = (Button) findViewById(R.id.btn_upload);
btnUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UploadFileTask uploadFileTask = new UploadFileTask();
uploadFileTask.execute();
}
});
}
Sekarang user dapat berinteraksi dengan hal lain di aplikasi kita tanpa perlu menunggu proses pengunggahan file selesai.
Kelas AsyncTask
AsyncTask adalah salah satu kelas yang mengimplementasikan asynchronous di dalam pemrograman Android. Kelas lainnya yang sama-sama mengimplementasikan antara lain Executor, ThreadPoolExecutor, dan FutureTask.
Method-method yang tersedia di dalam AsyncTask adalah:
onPreExecute() dieksekusi di thread utama sebelum proses asynchronous dieksekusi. Method ini biasanya digunakan untuk melakukan persiapan sebelum melakukan proses berat, misalnya seperti menampilkan progress bar.
doInBackground(Params…) dieksekusi di thread lain yang berjalan di belakang segera setelah onPreExecute() selesai dieksekusi. Method ini digunakan untuk menjalankan proses yang berat dan memakan waktu yang lama. Value hasil dari proses ini harus di return di method ini dan akan di-passing ke langkah terakhir. Method ini juga memperbolehkan kita menggunakan publishProgress(Progress…) untuk mengirim progress dari proses ini. Value dari progress tersebut akan dikirim ke thread utama di method onProgressUpdate().
onProgressUpdate(Progress…) dieksekusi di thread utama setelah pemanggilan publishProgress(Progress…). Method ini digunakan untuk menampilkan segala bentuk progress ketika proses yang berlangsung di doInBackground(Params…) sedang dieksekusi. Misalnya, untuk menampilkan berapa persen file yang sedang diunggah.
onPostExecute(Result) dieksekusi di thread utama setelah proses yang berlangsung di doInBackground(Params…) selesai dieksekusi. Value yang di return oleh doInBackground(Params…) akan di-passing ke method ini sebagai parameter.
Kesimpulan
Untuk merangkum semuanya, synchronous akan mengeksekusi proses secara berurutan satu sama lain di dalam satu thread. Setiap statement harus menunggu statement sebelumnya sampai selesai dieksekusi.
Sedangkan dalam asynchronous sebuah statement akan dieksekusi di thread terpisah, sehingga statement setelahnya tidak perlu menunggu sampai ia selesai dieksekusi.
Kita dapat mengimplementasikan hal ini ketika kita ingin agar seorang user dapat menghemat waktu dan melakukan interaksi dan hal lain di dalam sebuah aplikasi tanpa harus menunggu sebuah proses berat selesai dijalankan.
Terima kasih kepada anda yang membaca artikel ini, dan silahkan kirimkan komentar anda seputar pertanyaan atau hal lain yang ingin disampaikan mengenai artikel ini.
Happy coding!