RSS

AsyncTask pada Android plus Http Connection.

12 Jul

Halo semua, bikin tutorial lagi neh,
Oke, hari ini gw bakal jelasin tentang AsyncTask. Hmm, pada pernah denger threading kan? jadi suatu fungsi akan dikerjakan di background, lalu akan memberi tahu program pada saat fungsi tersebut uda selesai dikerjakan. Nah disini, gw bakal kasih contohnya, sekalian kita melakukan request ke web, dalam hal ini kita mau ambil gambar dari web.
Oke, ini bakal agak susah-susah gampang si, pertama-tama kita bikin xml isi nya ImageView aja deh.

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"
/>
</LinearLayout>

oke, sesudah itu kita bikin coding java nya, nah ini agak panjang, kita disini akan me-request gambar ini dari server:

main.java:

package com.daniel.async;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Window;
import android.widget.ImageView;
import android.widget.Toast;

public class main extends Activity {

ImageView image;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);

image = (ImageView)findViewById(R.id.image);

DownloadImage download = new DownloadImage();
download.execute();
}

public class DownloadImage extends AsyncTask<Void, Void, Bitmap>
{

@Override
protected void onPreExecute()
{
setProgressBarIndeterminateVisibility(true);
}
@Override
protected Bitmap doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
return getImage("https://danielhace.wordpress.com/wp-content/uploads/2011/03/android-sdk.jpg");
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
return null;
}
}

@Override
protected void onPostExecute(Bitmap result)
{
setProgressBarIndeterminateVisibility(false);
if(result != null)
image.setImageBitmap(result);
else
Toast.makeText(getBaseContext(), "Error in retrieving image", Toast.LENGTH_SHORT).show();
}

}

public Bitmap getImage(String url) throws IOException
{
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
try {
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();

BufferedInputStream bis = new BufferedInputStream(is);
Bitmap bmp = BitmapFactory.decodeStream(bis);
is.close();
bis.close();
return bmp;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
throw e;
} catch (IOException e) {
// TODO Auto-generated catch block
throw e;
}
}
}

Yak, ini penjelasannya.
Pertama-tama gw jelasin yang class baru DownloadImage ya. Jadi dia kita extends dengan AsyncTask, lalu tiga param <Void, Void, Bitmap> itu adalah:
Void yg pertama: parameter yang akan dipassing saat fungsi di execute.
Void yg kedua: return type saat AsyncTask di execute.
Bitmap(ketiga): hasil dari background yang akan di passing ke onPostExecute.
Void dengan “V” huruf besar ini maksudnya adalah object yang berisi kosong, karena AsyncTask tidak menerima “void”.
Nah, lalu saat kita membuat AsyncTask, yang harus ada adalah fungsi doInBackground(). Fungsi ini adalah yang akan dijalankan di background nantinya.
sementara itu kita dapat menambahkan fungsi onPreExecute() yaitu fungsi yang akan dijalankan sebelum fungsi background. Fungsi setProgressBarIndeterminateVisibility(true) adalah untuk menampilkan logo loading pada title bar. Untuk dapat menjalankan fungsi ini, kita perlu melakukan request yang ada pada onCreate dengan fungsi requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
Sama juga dengan fungsi onPostExecute, tapi fungsi ini menerima hasil return dari doInBackground() berupa Bitmap dalam kasus ini. setelah itu, disini kita mengubah image pada ImageView menjadi Bitmap yang telah kita dapatkan tadi.

Yak, selanjutnya pada fungsi getImage(). Disini kita mem-passing url image yang akan kita retrieve. Hmm, untuk fungsi di dalamnya, jujur saya juga kurang mengerti secara men-detail, tapi intinya adalah kita membuat HttpClient yang akan diperlukan untuk melakukan request, lalu setelah mendapat response, entity nya ditangkap dengan menggunakan InputStream, lalu di convert menjadi bentuk-bentuk yang kita inginkan, yang saya pernah si berupa String dan gambar (Bitmap).

Nah, akhirnya jangan lupa untuk menambahkan permission untuk mengakses internet masukkan code ini dalam tag <manifest> di AndroidManifest Anda:
<uses-permission android:name=”android.permission.INTERNET”></uses-permission>

Jadi inti dari tutorial ini, kita melakukan request untuk mengambil gambar dari server. Karena proses mengambil gambar ini lama, maka kita memerlukan AsyncTask agar aplikasi tetap berjalan seamless dan tidak hang di suatu tempat. Ini hasil Screenshotnya:

Yak, sekian tutorialnya, kalau misal penjelasannya kurang jelas atau tidak ada yang dimengerti, silakan tinggalkan comment aja, akan coba gw reply sebisanya..
Terima kasih..^^

 
6 Comments

Posted by on July 12, 2011 in Tutorial Advance

 

6 responses to “AsyncTask pada Android plus Http Connection.

  1. Amri

    July 12, 2011 at 11:02 am

    Mangstab Gan,
    Keep posting ya.

     
  2. toni

    July 14, 2011 at 8:56 am

    kenapa mesti di jalankan di background bang? kenapa bisa hang? sambil menunggu request gambar selesai, apakah aplikasi bisa menjalankan program/activity lain? terima kasih sekali atas tutorialnya bang. sngat membantu bagi pemula seperti saya.

     
    • Daniel Hace

      July 14, 2011 at 9:02 am

      Hmmm, jadi dalam programming normal itu jalanin tiap line code nya secara berurutan, maksudnya misal coding baris 2 baru akan dijalanin saat coding baris 1 selesai. Nah, kalo untuk kasus ini, kan dia request ke server nya makan waktu, tergantung koneksi, dsb. Jadi kita perlu tarik dia ke background, biar fungsi2 lain bisa berjalan dan aplikasi tidak hang.
      Nah, AsyncTask ini class yang sudah disediakan untuk membantu kita naruh fungsi2 di background, lalu saat udah selesai, baru dia akan melakukan fungsi yang kita tulis di onPostExecute..
      Thank you ya Toni bt pertanyaannya..

       
  3. doctor

    August 10, 2011 at 10:06 pm

    Mas carany klo ngambil banyak gambar gimana ya?
    mohon pencerahannya mas.
    terimakasih:D

     
  4. hans

    February 5, 2013 at 4:23 pm

    mas,aku mau nny ttg requestwindowfeature itu fungsiny buat apa ya?
    maklum masih awam..

     
    • Daniel Hace

      February 14, 2013 at 3:51 pm

      Hi Hans, requestWindowFeature itu method buat nampilin tanda loading di bar atas, biasanya sih biar user tau aja kalo dia lagi load sesuatu

      Thanks.

       

Leave a reply to Amri Cancel reply