Jumat, Maret 01, 2013

Memahami ASyncTask di Android Programming

http://3.bp.blogspot.com/-MI3cMMYJVNg/UBRQvVqhhjI/AAAAAAAAAg8/1q0wVpICnuU/s1600/Logo_Android.jpg

ASyncTask? apa sih itu? kayaknya pernah denger nih haha. ASyncTask adalah salah satu fitur di Android Programming untuk mengeksekusi operasi yang akan dilakukan secara background. Jadi initinya operasi dilakukan di background thread kemudian jika sudah selesai maka akan langsung ditampilkan di UI. Baik berhasil maupun gagal sesuai dengan yang sudah di set sebelumnya. Trus kenapa ini penting banget? bukannya kalo HW sekarang udah canggih ya dan cepet banget. Emang sih buat device Android jaman sekarang wuss wuss lah specnya tapi tetep aja masih ada sedikit lag apalagi jika data yang di proses cukup banyak.

Tapi ada yang hal yang cukup penting juga looo ini bisa mengatasi force close pada aplikasi yang di run di ICS. Berdasar pengalaman penulis ketika mendevelop aplikasi di GB(Android 2.3.3) atau lebih tepatnya menggunakan SDK GB kemudian menjalankan aplikasinya pada device Android dengan level ICS(android 4.0 keatas) ternyata force close berulang kali. Padahal ketika dijalan kan di GB lancar jaya loo tapi anehnya ketika di run di ICS eh malah force close. Terutama kita melakukan access network, ga tahu ada error apa eh tiba force close padahal koneksi lancar lancar aja.

Nah oleh karena itu kali ini penulis akan memberikan sebuah tutorial mengenai ASyncTask di Android. jadi ikuti dengan tenang ya, karena ini cukup mudah kok Open-mouthed smile.

Buat project baru bernama ASyncTask

Kemudian ketik koding berikut pada AsyncTaskActivity.java

package com.eepis.android;


import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;


public class ASyncTaskActivity extends Activity {

    Button btn_start;
    ProgressBar progressBar;
    TextView txt_percentage;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        btn_start    =    (Button) findViewById(R.id.btn_start);
        progressBar =     (ProgressBar) findViewById(R.id.progress);
        txt_percentage= (TextView) findViewById(R.id.txt_percentage);
       
        btn_start.setOnClickListener(new View.OnClickListener() {
           
            @Override
            public void onClick(View v) {
               
                btn_start.setEnabled(false);
                new ShowDialogAsyncTask().execute();
            }
        });
    }

   
    private class ShowDialogAsyncTask extends AsyncTask<Void, Integer, Void>{

        int progress_status;
       
        @Override
        protected void onPreExecute() {
            // update the UI immediately after the task is executed
            super.onPreExecute();
           
             Toast.makeText(ASyncTaskActivity.this,
                     "Invoke onPreExecute()", Toast.LENGTH_SHORT).show();

             progress_status    =    0;
             txt_percentage.setText("downloading 0%");
           
        }
       
        @Override
        protected Void doInBackground(Void... params) {
           
            while(progress_status<100){
               
                progress_status += 2;
               
                publishProgress(progress_status);
                SystemClock.sleep(300);
               
            }
            return null;
        }
   
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
           
            progressBar.setProgress(values[0]);
            txt_percentage.setText("downloading " +values[0]+"%");
           
        }
       
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
           
             Toast.makeText(ASyncTaskActivity.this,
                     "Invoke onPostExecute()", Toast.LENGTH_SHORT).show();
            
             txt_percentage.setText("download complete");
             btn_start.setEnabled(true);
        }
       
    }
}

Ketik kode berikut pada main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:padding="20dp"
        android:text="ASyncTask"
        tools:context=".AsyncTaskActivity" />

    <ProgressBar
        android:id="@+id/progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="34dp" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progress"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:minWidth="120dp"
        android:text="Start" />

    <TextView
        android:id="@+id/txt_percentage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/progress"
        android:text="downloading  0%"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

Hasil tampilan ketika aplikasi dijalankan

image

Penjelasan singkat:

class ini memungkinkan kita melakukan proses secara background. 4 fungsi yang ada di dalamnya masing masing berfungsi

1. onPreExecute()—> pada fungsi ini kita menyiapkan setingan inisialisasi operasi yang akan dijalankan

2. doInBackground()—> disini adalah bagian dimana operasi dilakukan secara background

3. onProgressUpdate()—> ketika proses.operasi berjalan setiap perubahan akan ditampilkan

4. onPostExecute()—> setalah proses/operasi selesai fungsi ini dijalankan

hal hal lain yang berkaitan dengan ASyncTask bisa dilihat pada link berikut ini

http://developer.android.com/reference/android/os/AsyncTask.html

Demikianlah tutorial kali ini semoga bisa bermanfaat buat kawan kawan sekalian. Untuk source projectnya bisa di download di alamat berikut

DOWNLOAD

Nah setelah kita berhasil mengimplementasikan AsyncTask di Android saatnya mencoba pada praktek yang sesungguhnya. Untuk postingan berikutnya akan saya tunjukkan bagaimana meload gambar dari internet dan menyimpannya pada memori cache di SD Card. So Keep Update ya Open-mouthed smile

jika ada pertanyaan silahkan saja email saya di bagibagi23@gmail.com

3 komentar:

  1. Mas kl artikel ini dihubungkan dengan yg ini http://dibagibagi.blogspot.com/2013/03/cara-mudah-parsing-json-array-dengan.html gmn mas, bisa dijelaskan (kl bisa dibuatin artikelnya biar mudeng hehe), maklum newbie bgt ni soal android tapi antusias pgn belajar :)

    BalasHapus
  2. terima kasih tutorialnya mas , apalagi tutorial bahasa Indonesia :D

    BalasHapus