Cara Menggunakan AsyncTask di Android

AsyncTask dapat diartikan sebagai proses asinkronous atau proses yang dilakukan secara terpisah dari proses utama, dalam hal ini adalah user interface (UI). Bahasa populer yang sering digunakan untuk menyebut istilah ini adalah proses yang dilakukan dibalik layar (background process).

Daftar isi catatan

  1. Tipe Umum dalam AsyncTask
  2. Langkah-Langkah Proses pada AsyncTask
  3. Menyiapkan Layout untu Percobaan AsyncTask
  4. Menyiapkan Activity untuk Percobaan AsyncTask
  5. Membuat Inner Class dengan extends AsyncTask
  6. Kode Lengkap MainActivity.java
  7. Output Eksekusi Project di Emulator

Tipe-Tipe Umum AsyncTask

AsyncTask secara umum memiliki 3 tipe generic. yaitu:

  1. Params. Parameter ini adalah ibarat sebuah komando yang harus dijalankan AsyncTask di background. Parameter dikirim dari UI melalui sebuah event.
  2. Progress. Tipe ini digunakan untuk memonitor progres atau kemajuan proses yang dijalankan di background. Tipe ini akan mengirim data ke UI secara simultan selama proses Asyncronous masih berjalan. Penerapan tipe ini seringkali dapat dilihat pada proses download yang dapat menampilkan progress download. Entah itu estimasi waktu download, total yang sudah didownload, atau lainnya.
  3. Result. Tipe ini digunakan untuk menampilkan hasil dari proses yang dijalankan di background.

[box type=”info” align=”” class=”” width=””]Tidak semua tipe AsyncTask selalu digunakan secara bersama-sama. Untuk menandai bahwa sebuah tipe tidak digunakan bisa menggunakan Void (V menggunakan kapital). Contoh: 

private class MyTask extends AsyncTask<String, Void, Void> { ... }

 [/box]

4 Langkah Proses Yang dilakukan AsyncTask

Ketika suatu proses dijalankan melalui AsyncTask maka akan melaui beberapa tahap proses yang dilakukan, yaitu:

  1. onPreExecute()

    Tahapan ini dilakukan sebelum proses dieksekusi (executed). Proses ini dilakukan di UI Thread. Biasanya digunakan untuk mengonfigurasi proses AsyncTask atau secara umum menampilkan progress bar atau lainnya untuk menandai bahwa proses AsyncTask akan dijalankan.

  2. doInBackground(String... params)

    Tahapan ini dijalankan setelah tahapan pertama di atas selesai dijalankan.  Tahapan ini adalah proses utama AsyncTask. Pada tahapan ini, kita bisa memonitor berjalannya progress menggunakan

     publishProgress(Progress...)

    yang akan mengirimkan data secara simultan ke tahapan

    onProgressUpdate(Progress...)
  3. onProgressUpdate(Progress...)

    Tahapan ini bisa kita gunakan untuk mengirim atau menampilkan data di UI mengenai sejauh mana proses AsyncTask berjalan. Paling sering kita jumpai adalah menampilkan proses download.

  4. onPostExecute(Result)

    Tahapan ini digunakan untuk menampilkan hasil proses yang dijalankan di Background.

Sebuah gambar yang kuambil dari Stackoverflow ini mungkin akan memudahkan kita untuk memahami mengenai proses AsyncTask bekerja.

AsyncTask Flows Image
AsyncTask Flows Image adapted from Stackoverflow

Referensi lebih jauh mengenai proses asinkronous ini bisa dibaca di situs resmi Android Developer di link berikut https://developer.android.com/reference/android/os/AsyncTask.html.

Cara Menggunakan AsyncTask di Android

Sekarang, kita mulai untuk menerapkan proses asinkronous pada aplikasi android yang sedang kita buat. Pada kesempatan ini, aku akan menerapkan AsyncTask pada project baru yang belum ada apa-apanya. Silahkan baca Cara membuat project baru di Android Setudio jika belum membuatnya.

Project ini akan menggunakan AsyncTask secara sederhana. Hanya menjalankan semacam setTimeOut() dengan durasi 20 detik. Selama proses AsyncTask berjalan, UI menampilkan progress bar yang berjalan dari 0 sampai 100 %.

Menyiapkan Layout

Buat layout dengan item sebagai berikut:

  1. TextView untuk menampilkan info sebelum progress, ketika progress berlangsung, dan setelah progress selesai dilaksananan.
  2. Button untuk memulai proses AsyncTask ketika tombol tersebut diklik
  3. ProgressBar untuk menampilkan presentase progress telah dilakukan

Kode layout tersebut secara keseluruhan bisa dilihat seperti di bawah ini:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.nusagates.asynctask.MainActivity">

    <ProgressBar
        android:id="@+id/progressBar"
        style="@style/tallerBarStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="37dp"
        android:max="100"
        android:progress="0"
        android:visibility="invisible" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/progressBar"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="16dp"
        android:text="Sebelum dimulai"
        android:textColor="@android:color/background_dark" />

    <Button
        android:id="@+id/btn_mulai"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="187dp"
        android:text="Mulai AsyncTask" />

</RelativeLayout>

Menambahkan Style untuk ProgressBar

Style ini ditambahkan pada file styles.xml yang terletak di dalam folder resvalues. Style ini akan mengubah tampilan ProgressBar menjadi lebih tinggi.

    <style name="tallerBarStyle" parent="@android:style/Widget.SeekBar">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
        <item name="android:indeterminateDrawable">@android:drawable/progress_horizontal</item>
        <item name="android:minHeight">50dip</item>
        <item name="android:maxHeight">100dip</item>
    </style>

Menyiapkan View di Activity

Pertama, deklarasikan TextView, Progressbar, Button di dalam class MainActivity.java

    TextView text;
    ProgressBar pb;
    Button mulai;

Integrasikan variabel-variabel tersebut dengan komponen yang telah ditambahkan pada activity_main.xml. Pengintegrasian ini dilakukan di dalam method onCreate().

        text =(TextView)findViewById(R.id.textView);
        mulai=(Button)findViewById(R.id.btn_mulai);
        pb=(ProgressBar)findViewById(R.id.progressBar);

Membuat Inner Class untuk Menjalankan AsyncTask

Kode inner class ditulis di luar method onCreate() namun masih di dalam class MainActivity.java

Kode tersebut ditulis dengan extends AsyncTask<param, progress, result>.

public class testAsync extends AsyncTask<String, Integer, String>{
   //proses background dilakukan di sini
}

di dalam innerclass testAsynct tersebut selanjutnya kita tambahkan proses preExecute() untuk menampilkan progressBar, mengganti text dan warna TextView sebelum dijalankan.

    @Override
    protected void onPreExecute(){
        //menjalankan perintah sebelum eksekusi
        pb.setVisibility(View.VISIBLE);
        text.setTextColor(Color.WHITE);
        text.setText("Memulai sesuai perintah...");
    }

Selanjutnya membuat proses inti yang dijalankan secara asinkronous. Pada kesemtapan ini proses tersebut hanya berupa count douwn dari 20 sampai 0 dengan interval 1000 milisecond atau setara dengan 1 detik.

@Override
    protected String doInBackground(String... params) {
        //proses eksekusi dilakukan di sini
        for (int i = 0; i < 20; i++) {
            try {
                Thread.sleep(1000);
                publishProgress(i);
            } catch (InterruptedException e) {
                Thread.interrupted();
            }
        }
        return "Selesai";
    }

Selama proses AsyncTask berlangsung,  

publishProgress(i);

  mengirim data i ke langkah

onProgressUpdate(progress...)

.

Selanjutnya, kita perlu menampilkan data mengenai sejauh mana proses AsyncTask tersebut berlangsung dengan kode seperti di bawah ini:

    @Override
    protected void onProgressUpdate(Integer... Values){
        //monitoring progress eksekusi untuk dikirim ke UI
        text.setText(String.valueOf(Values[0]));
        pb.setProgress((((100/20)*Values[0])+(100/20)));
    }

Selanjutnya, kita mengisi TextView dengan teks “selesai” yang diambil dari doInBackground() melalui argumen s.

    @Override
    protected void onPostExecute(String s){
        //hasil eksekusi ditampilkan di sini
        super.onPostExecute(s);
        if(s!=null && s!=""){
            text.setText(s);
        }
    }

Terakhir, kita eksekusi AsyncTask ketika tombol yang kita buat diklik dengan kode berikut:

        mulai.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new testAsync().execute("");
            }
        });

Kode lengkap MainActivity.java adalah seperti di bawah ini:

package com.nusagates.asynctask;

import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView text;
    ProgressBar pb;
    Button mulai;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text =(TextView)findViewById(R.id.textView);
        mulai=(Button)findViewById(R.id.btn_mulai);
        pb=(ProgressBar)findViewById(R.id.progressBar);
        mulai.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new testAsync().execute("");
            }
        });

    }
public class testAsync extends AsyncTask<String, Integer, String>{
    @Override
    protected void onPreExecute(){
        //menjalankan perintah sebelum eksekusi
        pb.setVisibility(View.VISIBLE);
        text.setTextColor(Color.WHITE);
        text.setText("Memulai sesuai perintah...");
    }

    @Override
    protected String doInBackground(String... params) {
        //proses eksekusi dilakukan di sini
        for (int i = 0; i < 20; i++) {
            try {
                Thread.sleep(1000);
                publishProgress(i);
            } catch (InterruptedException e) {
                Thread.interrupted();
            }
        }
        return "Selesai";
    }

    @Override
    protected void onProgressUpdate(Integer... Values){
        //monitoring progress eksekusi untuk dikirim ke UI
        text.setText(String.valueOf(Values[0]));
        pb.setProgress((((100/20)*Values[0])+(100/20)));
    }
    @Override
    protected void onPostExecute(String s){
        //hasil eksekusi ditampilkan di sini
        super.onPostExecute(s);
        if(s!=null && s!=""){
            text.setText(s);
        }
    }
}
}

Hasil eksekusi project ini bisa dilihat pada gambar di bawah ini:

Cara Menggunakan AsyncTask di Android
Cara Menggunakan AsyncTask di Android

Demikian cara menggunakan AsyncTask di Android.

Sampaikan pendapatmu di sini.
Ahmad Budairi
Ahmad Budairihttps://bloggersejoli.com/
Seorang Web developer yang suka menulis artikel di blog. Kader Penggerak Nahdlatul Ulama (NU)

Bacaan Menarik Lainnya

Tanggapan Kamu?

Baru Terbit