Salah satu hal yang sangat penting dalam
pembuatan berbagai aplikasi termasuk aplikasi berbasis mobile adalah penggunaan
thread. Thread adalah suatu struktur
pengendali program yang dapat dijalankan secara background, dan cara kerjanya adalah seperti listener. Sebagai contoh penggunaan pada sebuah perangkat SMS, maka
paling tidak, ada dua buah thread,
yaitu thread untuk mengirim pesan dan
thread untuk menerima pesan.
Penggunaan thread sangat bagus untuk
menghindari adanya deadlock pada
suatu layanan.
Dengan semakin umumnya penggunaan chip multicore pada smartphone, penggunaan thread yang memungkinkan beberapa task
berjalan secara paralel semakin penting untuk meningkatkan kinerja app. Multicore sudah disupport Android sejak
versi HoneyComb (3.0). Selain itu,
app Android yang terlalu lama berproses dan membuat user interface “hang”
akan terkena error ANR (Application
Not Responding). Thread dapat
digunakan untuk mengatasi ini dengan memindahkan aktivitas yang lama pada thread yang terpisah.
Contoh multithread
pada desktop adalah aplikasi Word di Windows. Saat kita membuka Word dan
melakukan penyimpanan, kita secara bersamaan
masih dapat mengedit dokumen. Kedua aktivitas ini dilakukan oleh aplikasi yang
sama tapi dalam thread yang terpisah.
Sebelumnya perlu dibedakan antara thread dan proses. Thread dan proses sama-sama merupakan urutan kode yang dieksekusi.
Pada Android, yang dasarnya adalah Linux, setiap app yang dijalankan
berada di proses yang terpisah. Satu proses kemudian dapat memiliki satu atau
lebih thread. Thread-thread di dalam
proses yang sama berbagi memory, walaupun setiap thread punya register dan stack sendiri. Proses independen satu
sama lain, sedangkan thread-thread
pada proses yang sama saling terkait seperti gambar di bawah ini
Kenapa menggunakan thread? karena untuk men-create proses mahal dari sisi resources dibandingkan thread dan komunikasi antar thread lebih mudah dibandingkan antar
proses. Kasus yang menarik di desktop adalah browser Chrome vs Firefox. Setiap tab pada Chrome menggunakan proses
yang berbeda, sedangkan Firefox menggunakan thread yang berbeda untuk setiap
tab. Coba lihat task manager saat membuka banyak tab di Chrome, akan banyak proses
bernama Chrome.exe. Pembuat
Chrome beralasan dengan arsitektur seperti ini, jika salah satu tab “hang” maka
tidak akan mempengaruhi tab yang lain. Tapi efek sampingnya, Chrome
membutuhkan lebih banyak memori dibandingkan Firefox. Firefox sebenarnya juga
menggunakan multi proses, tapi hanya untuk plugin, karena plugin
sering menjadi sumber masalah.
Terlepas dari keunggulannya, penggunaan multithread atau multiproses juga dapat
menimbulkan masalah, misalnya sinkronisasi, deadlock,
race condition dan starvation. Program juga lebih sulit
didebug dan kadang malah kinerjanya lebih jelek. Walaupun Java dan
Android telah menyediakan berbagai library untuk memudahkan pembuatan program multithreading, tetap saja ini bukan hal
yang mudah.
Kembali ke Android, saat setiap app
dijalankan maka app tersebut memiliki thread
utama yang disebut main thread
atau UI thread. UI thread ini
mengatur tampilan, menerima event dan sebagainya. Aturan yang harus dipegang
adalah:
1.
Jangan
memblok UI thread. Misalnya
saat user menekan tombol, maka app menjalankan program yang loop sejuta
kali sehingga membuat user interface
macet. Ini akan berakibat muncul error
ANR (App Not Responding). Resources pada smartphone jauh lebih terbatas daripada PC/laptop, sehingga aturan
ini lebih ketat.
2.
Jangan
mengakses komponen UI di luar UI thread. Misalnya ada thread kedua dan thread
ini mengakses TextView, Button dsb. Ini dapat menyebabkan error yang tidak
terduga.
Ada
beberapa cara teknik paralelisasi di Android yaitu : AsyncTask, IntentServices
dan Java thread
Mana
yang lebih tepat? tergantung masalahnya.
AsyncTask
APA ITU
ASYNCTASK?
AsyncTask adalah class yang disediakan
Android untuk memudahkan programmer membuat task yang dijalankan di-background. AsyncTask cocok untuk proses
background yang relatif sederhana dan pendek. Misalnya saat mendowload objek
dari internet, dan dalam prosesnya UI akan menampilkan kemajuan download.
Contoh : penggunaan AsyncTask saat mengambil data dari API. Proses pengambilan datanya
terjadi di background dan di UI nya
hanya menampilkan ProgressDialog.
Ketika semua data sudah di ambil, maka secara bersamaan akan ditampilkan.
Contoh lain,
saat kita mendownload aplikasi, lagu, video atau apapun dari internet, proses
tersebut juga menggunakan AsyncTask di UI hanya menampilkan persentase
downloadingnya (1% – 100%).
PARAMETER DALAM ASYNTASK
AsyncTask
mempunyai tiga parameter yaitu :
1. Params adalah array dari parameter yang digunakan
dalam metode doInBackground().
2. Progress adalah adalah parameter untuk progress bar
yang digunakan oleh metode onProgressUpdate
().
3. Result adalah parameter dari hasil operasi yang
dilakukan oleh metode doInBackground()
dan diberikan ke metode onPostExecute() sebagai parameternya.
METODE-METODE DALAM ASYNCTASK
Dalam proses AsyncTask terdapat beberapa method yang digunakan, antara lain :
1.
onPreExecute(),
Method ini
dipanggil sebelum task dikerjakan, biasanya digunakan untuk inisiasi users.
2.
doInBackground(Void… params),
Pada method
ini proses thread berjalan, proses pengiriman/pengambilan data terjadi disini.
Prosesnya berjalan dibackground. Method ini langsung berjalan setelah onPreExecute() berjalan. Pada proses
gunakan publishProgress(params) untuk mengupdate progressnya sudah sampai
mana saja. Tapi ingat, jangan menambahkan ProgressDialog/ProgressBar
di method ini. Kalian hanya boleh menambahkan ProgressBar/ProgressDialog di method onProgressUpdate(String… values).
3.
onProgressUpdate(String… values),
Method ini
digunakan ketika di method doInBackground(Void.. params) telah memanggil method
publishProgress(params). Di method ini kalian bisa tampilkan UI untuk
pemberitahuan bahwa pengambilan/pengiriman data sedang berlangsung. Kalian bisa
gunakan progressBar atau ProgressDialog.
4.
onPostExecute(Void aVoid),
Method ini digunakan
untuk mengupdate User Interface
ketika proses doInBackground(Void…
params) telah selesai.
MENGGUNAKAN
ASYNCTASK
Dengan AsyncTask, kita bisa melakukan pekerjaan
asinkron pada antarmuka pengguna. AsyncTask memblokir operasi di thread pekerja
kemudian mempublikasikan hasilnya di thread UI, tanpa mengharuskan kita untuk
menangani sendiri thread dan/atau penangan sendiri.
Untuk
menggunakannya, kita harus menjadikan AsyncTask
sebagai subkelas dan mengimplementasikan metode callback doInBackground() yang berjalan di pool thread latar belakang. Untuk memperbarui
UI, kita harus mengimplementasikan onPostExecute(), yang mengirim hasil dari doInBackground() dan berjalan di thread UI, jadi kita bisa memperbarui UI dengan
aman. Kemudian kita bisa menjalankan tugas dengan memanggil execute() dari thread UI.
IntentServices
Service
cocok untuk task yang membutuhkan waktu lama, berjalan di background dan tidak
membutuhkan akses ke user interface. Misalnya saat app mengirimkan data ke
server, user dapat menekan tombol “send” dan kemudian melanjutkan menggunakan
app untuk yang lain. Contoh yang lain adalah streaming musik di backround dan
download.
Perbedaan
utama antara Services dengan Asynctask adalah Asynctask cocok untuk
task yang berjalan di background yang terkait dengan user interface sedangkan
service cocok untuk task background
yang independen terhadap user interface. Untuk memberikan notifikasi ke user
dari service, dapat digunakan toast atau notification bar. Perbedaan lain
dengan AsyncTask adalah service mendapat prioritas lebih tinggi sehingga lebih
kecil kemungkinannya untuk dimatikan, walaupun jika kehabisan memory service dapat dimatikan untuk
kemudian direstart lagi.
Fungsi
service ada dua: pertama meminta sistem menjadwalkan task di background yang
akan terus berjalan sampai service berhenti. Fungsi kedua adalah menyediakan
layanan pada app lain. Service bukan thread dan berada di thread utama (UI
thread). Itu sebabnya kita tetap perlu membuat thread terpisah di service untuk
task yang panjang karena tetap dapat menyebabkan error ANR.
Seperti
halnya AsyncTask, Android menyediakan IntentService
untuk memudahkan programmer menggunakan service. IntentService secara otomatis
akan membuat thread baru (disebut worker
thread) dan menangani antrian pemanggilan service (jika service dipanggil
berkali-kali). Intinya programmer tidak perlu lagi memikirkan pengelolaan
thread di dalam service.
Untuk
menggunakan IntentService, extends kelas
IntentService dan override method
create() dan onHandleIntent().
Task yang berjalan di backround diletakkan di onHandleIntent().
Tetapi kita
perlu membuat kelas khusus untuk menampilkan toast terlebih dulu. Toast tidak
dapat langsung digunakan karena onHandleIntent berjalan di worker thread, bukan
UI thread. Oleh karena itu perlu
digunakan handler. Handler adalah
objek yang dapat digunakan untuk berkomunikasi antar thread. Handler akan
berada pada thread yang membuatnya. Karena service dicreate oleh UI
thread, maka handler otomatis juga ada di UI thread. Jadi kita bisa menggunakan
handler untuk berkomunikasi dari worker
thread ke UI thread.
Java
Thread
Cara lain melakukan proses di background
adalah menggunakan thread seperti halnya yang disediakan Java. Cara ini lebih
fleksibel daripada AsyncTask, tetapi lebih sulit. Sebenarnya Asynctask, IntentService
dan lain-lain dibuat menggunakan library java thread ini.
Untuk membuat thread baru, dapat digunakan
kelas Thread. Ada dua cara menjalankan thread, pertama dengan menggunakan objek
Runnable, kedua dengan meng-override method Run di kelas Thread. .
Cara pertama, menggunakan Runnable. Runnable
adalah kelas yang berisi potongan code yang harus dijalankan.
Cara yang kedua adalah tanpa runnable, dengan
meng-extends kelas Thread.
Handler
Cara lain untuk berkomunikasi
dengan UI thread adalah dengan Handler.
Handler adalah objek yang
digunakan untuk berkomunikasi antar thread. Di UI thread kita buat
handler, lalu objek handler ini di-pass ke thread. Thread kemudian
berkirim pesan melalui handler.
Sumber Referensi:
Chughn Anupam. Android AsyncTask Example Tutorial. Diakses dari https://www.journaldev.com/ pada 23 Oktober 2017 jam 16.10 WIB
Laksito Arif. ( 2012). AsynTask di Android. Amikom.
Anonim. (2012). Proses dan
Thread. Diakses dari https://developer. android.com pada 23 Oktober 2017 jam 16.30
WIB.
Anonim. thread-vs-process.
Diakses dari https://sites.google.com/site/ sureshdevang. pada 23 Oktober
2017 jam 16.50 WIB pada 23 Oktober 2017 jam 16.50 WIB