Rabu, 25 Oktober 2017

Thread untuk OS Android

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 interfacehang”  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

0 komentar:

Posting Komentar