Android Thread (4): Java Thread

Jika pertama kali menggunakan thread, dianjurkan untuk membaca dulu bagian pertama yang membahas pendahuluan tentang thread lalu mencoba bagian kedua tentang implementasi thread yang paling sederhana, AsyncTask terlebih dulu.

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. Contoh berikut akan lebih menjelaskan (baca saja contohnya, tidak perlu dibuat).

Cara pertama, menggunakan Runnable. Runnable adalah kelas yang berisi potongan code yang harus dijalankan. Berikut contoh class yang meng-implement Runnable:

public class MyRunnable implements Runnable {
   public void run() {
       //code yang akan dijalankan
   }
}

Lalu buat objek thread, dan jadikan objek runnable tersebut menjadi parameter

//versi panjang:
MyRunnable r  = new MyRunnable();
Thread t = new Thread(r); //runnnable jadi parameter
t.start();  //thread dimulai

Cara yang lebih singkat dan lebih umum adalah dengan anonymous class

//versi pendek dengan anonymous class
(new Thread(new MyRunnable())).start();

Cara yang kedua adalah tanpa runnable, dengan meng-extends kelas Thread. Contohnya sebagai berikut:

public class MyThread extends Thread {
   public void run() {
       //code yang akan dijalankan
   }
}

Dan untuk menjalankannya:

(new MyThread()).start();

Cara pertama dengan Runnable lebih umum digunakan karena tidak perlu meng-extends class Thread.

Di Android, untuk mengupdate UI, harus menggunakan method View.post dengan parameter kelas Runnable. Lebih jelasnya dapat dilihat di contoh berikut.

Kita akan membuat app seperti tutorial AsyncTask sebelumnya. Pada app tersebut terdapat satu button yang jika ditekan akan menjalankan 100 loop yang setiap loopnya membutuhkan waktu cukup lama. Setiap akhir loop, kemajuan akan terlihat di progressbar. Isilah onclick pada button sebagai berikut:

ProgressBar pb;
int progress=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   pb = (ProgressBar) findViewById(R.id.progressBar);
}

public void onClick(View v) {
   //jika diklik, jalankan thread 
   new Thread(new Runnable() {
       public void run() {
	   //ini proses yg di background	 
           for (int i = 0; i<100;i++) {
               try {
                   Thread.sleep(50);  //delay 0.05 detik, simulasikan proses panjang
                   progress = i;
                   //update user interface harus menggunakan View.post(Runnable)
		   //pb adalah progressbar	
                   pb.post(new Runnable() {
                       public void run() {
                           pb.setProgress(progress);
                       }
                   });
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       }
   }).start();
}

Latihan: dari program diatas, bagaimana kita menambahkan tulisan “mulai” saat proses bacground dimulai dan “sukses” saat selesai?

 

Handler

Cara lain untuk berkomunikasi dengan UI thread adalah dengan Handler.  Pada contoh diatas kita menggunakan ProgressBar.post(), tetapi semakin kompleks interaksi antara thread  dan UI maka code akan semakin sulit dibaca. Handler dapat digunakan untuk mengatasinya.

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.

Baik kita langsung buat saja. Pertama buat kelas baru yang berisi thread yang akan memproses dibackground. Kelas ini (ThreadDgnHandler) mengextends kelas Thread. Kelas ini menerima parameter Handler dari UI. Untuk mengirim informasi, gunakan method .obtainMessage() dan .sendToTarget() dari Handler.

public class ThreadDgnHandler extends Thread {
    private final Handler mHandler; //handler dari UI

    //constructor
    public ThreadDgnHandler(Handler mHandler) { 
        this.mHandler = mHandler;
    }

    public void run() {
        //kirim pesan mulai, update ke UI
        //1: konstanta "1" artinya pesan untuk update textivew. konstanta bebas
        //-1: paramter 1, tidak digunakan
        //-1: paramter 2, tidak digunakan
        //"Mulai": paramter 3, bisa objek apapun
        mHandler.obtainMessage(1, -1, -1, "Mulai").sendToTarget();

        //loop peroses background
        for (int i = 0; i<100;i++) {
            try {
                Thread.sleep(50);  //delay 0.05 detik
                //2: konstanta "2" artinya update progres barr
                //i: paramter 1, progressnya
                //paramter yang lain tidak digunakan
                mHandler.obtainMessage(2, i, -1,null).sendToTarget();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //kirim pesan selesai
        mHandler.obtainMessage(1, -1, -1, "Selesai").sendToTarget();

    }
}

Selanjutnya buat objek handler di main activity. Handler ini akan mengupdate textview dengan “mulai””dan “selesai” sekaligus progressbar. Karena handler ini dicreate di UI thread maka handler juga akan berjalan di UI thread dan dapat digunakan untuk mengupdate UI.

    /**
     * Handler yang mendapat informasi dari ThreadDgnHandler
     * Handler ini ada di UI thread, jadi dapat digunakan untuk mengupdate UI
     */
    private final Handler mHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg) {
                //1: artinya update textview
                //2: artinya update progressbar
                if (msg.what==1) {
                    String pesan = (String) msg.obj;
                    tvHasil.setText(pesan);
                } else
                if (msg.what==2) {
                    pb.setProgress(msg.arg1); //arg1 berisi progress
                }
            }
        };

Sekarang buat tombol yang menggunakan handler (gambar bawah), jangan lupa hubungkan onClicknya dengan method berikut:

ScreenHunter_158 Dec. 12 21.22


 public void klikDgnHandler(View v) {
        //memproses dengan handler
        //kalau contoh sebelumnya menggunakan View.post
        //kalau ini dengan handler

        //handler dipassing jadi paramter
        ThreadDgnHandler tdh = new ThreadDgnHandler(mHandler);
        tdh.start();
 }

Terlihat code lebih bersih dan mudah dibaca dibandingkan dengan contoh pertama.

 

 

 

 

 

 

Source code untuk tutorial ini: https://github.com/yudiwbs/CobaThread

 

Leave a Reply

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

Time limit is exhausted. Please reload CAPTCHA.