Android Thread (2): AsyncTask

Update versi terakhihr (google doc): https://docs.google.com/document/d/1K03-kHsokJ4aE5u2Ec4cxsaYFubheIAlJ8DqgmrvW_s/edit?usp=sharing

Catatan: jika belum mengerti tentang thread, baca dulu bagian 1.

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.

Sebelum memulai tutorial, ada empat method terpenting dalam AsyncTask.

  1. onPreExecute() dipanggil sebelum task dikerjakan. Biasanya untuk menginisasi user interface.
  2. doInBackground(Params…), berisi task inti yang perlu dijalankan di background dan berpotensi memblok UI. Method ini akan dijalankan di thread background langsung setelah onPreExecute dipanggil. Gunakan  publishProgress(Progress…) untuk mengupdate UI mengenai progress (misal mengupdate progressbar). JANGAN update UI dimethod ini! gunakan onProgressUpdate.
  3. onProgressUpdate(Progress…)  dipanggil setelah publisProgress dijalankan. Berisi code untuk mengupdate user interface.  JANGAN panggil onProgressUpdate langsung!  gunakan publishProgress (tanpa on). Method ini berjalan di UI thread sehingga aman untuk memanipulasi komponen UI.
  4. onPostExecute(Result), dapat digunakan untuk mengupdate user interface setelah task background selesai. Hasil dari komputasi dipassing sebagai parameter.

Supaya lebih jelas kita akan membuat contoh app yang jika tombolnya ditekan maka akan mensimulasikan task yang cukup lama (100 loop yang setiap loopnya berisi sleep beberapa milidetik). Saat setiap satu loop berakhir maka progressbar akan diupdate.

Pertama, tambahkan tiga komponen view seperti gambar di bawah. Satu label, satu progress bar (horizontal) dan satu button:

ScreenHunter_123 Nov. 25 23.15
Tambahkan code berikut, yang akan dijalankan saat button ditekan.

public void klikMulai(View v) {
   //button ditekan
   pb.setMax(100);
   new KerjakanBackgroundTask().execute(); //tidak ada parameter
}

Jangan lupa set property dari button:

ScreenHunter_124 Nov. 25 23.18

Tambahkan code berikut, perhatikan penggunaan extends AsyncTask. Harap baca penjelasan dalam comment.

private class KerjakanBackgroundTask extends AsyncTask<Void, Integer, String> 
/*
 Tiga parameter (Void, Integer, String): 
1. Parameter ke background task; 
2. Pogress saat background task dijalankan
3. Result hasil dari background task
Untuk kasus di app ini (untuk app lain bisa berbeda):
1.Param ke bacground task: Void (tidak ada)
2.Progress saat background task dijalankan: Integer (setiap loop diincrement dan dikirim ke progressbar
3.Result: String (output)
*/
{
   //sebelum proses
   protected void onPreExecute() {
       pb.setProgress(0);
       tvHasil.setText("Mulai");
   }

   //proses
   protected String doInBackground(Void... v) {
       String hasil="-";
       try {
           for (int i = 0; i<100;i++) {
               Thread.sleep(50);  //delay 0.05 detik biar lama
               //update user interface dengan publichProgress
               //JANGAN ada update user interface langsung
               publishProgress(i);
               if (isCancelled()) {  
                   hasil = "batal";
                   break; //user bisa cancel ditengah task
               }
           }
           hasil = "Sukses";
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       return hasil;  //result
   }

   //progress
   protected void onProgressUpdate(Integer... progress) {
   //Update user interface disini karena ini berjalan di UI thread
   //Integer... (tiga titik) artinya parameter bisa inteteger lebih dari satu
   //dan bentuknya array
   //jangan panggil onProgress langsung, gunakan publichProgress!

       pb.setProgress(progress[0]);
   }

   
   protected void onPostExecute(String result) {
   //selesai, bisa update user interface karena ini berjalan di UI thread
       tvHasil.setText(result);
   }
}

Jika dijalankan dan button ditekan, maka progressbar akan bergerak sedikit demi sediikit, dan setelah selesai maka textview akan diisi dengan hasil (string “Sukses”). Result dapat diganti tipenya menjadi integer atau float.

Kelemahan Asynctask adalah jumlah task dalam satu app terbatas. Asynctask juga terkait dengan Activity, sehingga dapat bermasalah jika Activity di-destroy (misal saat device di rotate).

Source code tutorial ini: https://github.com/yudiwbs/AsyncTask_Demo

Lanjut ke materi thread berikutnya: IntentService

todo:loader untuk masalah activity yang didestroy.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.